标签: entity-framework-5

如何使用Model First方法使用动态连接字符串,但仍然使用EDMX中的数据模型?

我使用EF 5和Model First方法创建了一个EDMX,即我从一个空白设计师开始并模拟我的实体.现在,我希望能够使用EDMX中定义的此模型,但提供运行时SQL Server连接字符串,而无需修改配置文件.

我知道如何将连接字符串传递给DbContext,但问题是找到程序集中映射的元数据.

例如,我的EDMX在app.config中有这个连接字符串

<add name="MesSystemEntities" connectionString="metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyMachine;initial catalog=MesSystem;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud)

我失踪的部分是 "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;"

我希望能够以DbContext编程方式创建一个SQL Server连接字符串,但"添加"元数据部分.

这就是我希望T4文件生成的内容......

public partial class MesSystemEntities : DbContext
{
    public MesSystemEntities()
        : base("name=MesSystemEntities")
    {
    }

    public MesSystemEntities(string sqlServerConnectionString)
        : base(GetEfConnectionString(sqlServerConnectionString))
    {    
    }

    private string GetEfConnectionString(string sqlServerConnectionString)
    {
       // values added by T4 generation
       string format = "metadata=res://*/Data.DataContext.EntityFramework.MesSystem.csdl|res://*/Data.DataContext.EntityFramework.MesSystem.ssdl|res://*/Data.DataContext.EntityFramework.MesSystem.msl;;provider=System.Data.SqlClient;provider connection string=\"{0}\"";    
       return String.Format(format, sqlServerConnectionString);
    }
...
}
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在T4生成文件中获取我需要的元数据来创建实体框架连接,而无需为每个EDMX文件对其进行硬编码

要么

是否有更简单的方法以编程方式从程序集加载元数据?

c# t4 entity-framework .net-4.5 entity-framework-5

8
推荐指数
1
解决办法
4704
查看次数

标识规范设置为false

我正在使用EF5Code First创建数据库.当Entity具有时Id field,EF Primary Key在数据库中创建这样的字段并设置Identity specificationtrue(自动生成的值).怎么设置Identity specification to false by default

entity-framework entity-framework-5

8
推荐指数
1
解决办法
8958
查看次数

WebSecurity.CreateUserAndAccount propertyValues

我正在写一个mvc 4 c#.net 4.5网站

我想创建一个新的公司对象并注册一个链接到该公司的新用户.

我的帐户模型是:

    [Table("UserProfile")]
    public class UserProfile
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int UserId { get; set; }
        public string UserName { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string EmailAddress { get; set; }
        public string PhoneNumber { get; set; }
        public bool MarketingEmailOptin { get; set; }
        public bool isDisabled { get; set; }
        public virtual Company CompanyICanEdit { get; set; } 
    }
Run Code Online (Sandbox Code Playgroud)

如果我调用以下内容,则会将用户添加为罚款,但对于CompanyICanEdit字段为null:

WebSecurity.CreateUserAndAccount(addCompanyViewModel.User.UserName, …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc-4 entity-framework-5

8
推荐指数
1
解决办法
1万
查看次数

EF迁移:将索引字段更改为可空时出错

我初始迁移中的代码如下

        CreateTable(
            "dbo.Sites",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Description = c.String(maxLength: 450)
                })
            .PrimaryKey(t => t.Id);
Run Code Online (Sandbox Code Playgroud)

为了使Description字段是唯一的,我将以下内容添加到UP方法的末尾

CreateIndex("dbo.Sites","Description",唯一:true);

后来我决定要求描述字段.

新迁移会产生以下更改

AlterColumn("dbo.Sites","Description",c => c.String(nullable:false,maxLength:450));

但是,当此更改尝试运行时,我收到错误

ALTER TABLE ALTER COLUMN描述失败,因为一个或多个对象访问此列.

我能够使用分析器隔离SQL行,如

ALTER TABLE [dbo].[Sites] ALTER COLUMN [描述] nvarchar NOT NULL

当我在Management Studio中运行它时,会出现以下错误

消息5074,级别16,状态1,行1索引'IX_Description'取决于列'描述'.消息4922,级别16,状态9,行1 ALTER TABLE ALTER COLUMN描述失败,因为一个或多个对象访问此列.

如何获取迁移代码以删除索引,然后更改更改列,然后重新构建索引?

我正在使用SQL Server 2008 R2

ef-migrations entity-framework-5

8
推荐指数
1
解决办法
5590
查看次数

如何强制实体框架不要查询为sp_executesql

我有一个有10亿行的桌子.当我查询clausule和值是硬编码的时候(tabulka = tabulka.Where(x => x.Value.Contains("value")sql查询是作为批处理发送到sql.它花了大约5秒.当值不是硬编码(tabulka = tabulka.Where(x => x.Value.Contains(value))时,查询发送一个RPC并花了15秒.

这是EF发送给SQL(来自Profiler)的真实示例:

exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[Tabulka] AS [Extent1]
    WHERE ([Extent1].[Column] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent1].[Column] LIKE @p__linq__1 ESCAPE N''~'')
)  AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'%text1%',@p__linq__1=N'%text2%'
Run Code Online (Sandbox Code Playgroud)

这需要15秒.

当我添加OPTION(RECOMPILE)时花了5秒钟:

exec sp_executesql N'SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    COUNT(1) AS [A1]
    FROM [dbo].[Tabulka] AS [Extent1]
    WHERE ([Extent1].[Column] LIKE @p__linq__0 ESCAPE N''~'') AND ([Extent1].[Column] LIKE @p__linq__1 ESCAPE N''~'')
)  AS [GroupBy1] …
Run Code Online (Sandbox Code Playgroud)

c#-4.0 entity-framework-5

8
推荐指数
1
解决办法
1999
查看次数

使用扩展方法(EF5)返回DbContext.Detach()方法

有没有Detach(object entity)DbContext实体框架5.

要分离实体,现在需要改变状态.也许我错过了一些东西,但这似乎比使用该Detach方法更不直观和可读:

context.Entry(myEntity).State = EntityState.Detached;
Run Code Online (Sandbox Code Playgroud)

我很想创建一个扩展方法来恢复Detach方法:

public static void Detach(this MyEntities context, object entity)
{
    context.Entry(entity).State = EntityState.Detached;
}
Run Code Online (Sandbox Code Playgroud)

Microsoft删除EF 5中的DbContext.Detach()方法的原因是什么?

.net c# entity-framework entity-framework-5

8
推荐指数
2
解决办法
1万
查看次数

实体框架代码第一个通用数据库审计字段

我是Entity Framework的新手,过去我直接使用Enterprise Library或ADO.NET将模型映射到数据库表.我使用的一种模式是将我的公共审计字段放在基类中的每个表中,然后为每个对象继承该基类.

我采取两个步骤来保护两个字段(Created,CreatedBy):

  1. 在Base Enitity上创建一个无参数构造函数私有,并创建第二个需要Created和CreatedBy的构造函数在创建时传递.
  2. 使setter Private,以便在创建对象后无法更改值.

基类:

using System;

namespace App.Model
{
    [Serializable()]
    public abstract class BaseEntity
    {
        public bool IsActive { get; private set; }
        public DateTimeOffset Created { get; private set; }
        public string CreatedBy { get; private set; }
        public DateTimeOffset LastUpdated { get; protected set; }
        public string LastUpdatedBy { get; protected set; }

        private BaseEntity() { }

        protected BaseEntity(DateTimeOffset created, string createdBy)
        {
            IsActive = true;
            Created = created;
            CreatedBy = createdBy;
            LastUpdated …
Run Code Online (Sandbox Code Playgroud)

c# oop entity-framework entity-framework-5

8
推荐指数
2
解决办法
3434
查看次数

无法使用现有数据库运行EF5迁移

首先,我已经阅读了这些问题/答案:

这些似乎都适用于EF5之前的EF版本,我的情况似乎不适合这些答案.所以,让我描述一下我的情况.

  1. 我的应用程序最初是使用EF4创建的,模型优先.我使用GUI设计器设计了我的数据库,并用它来生成我的数据库.
  2. 我已经运行并将数据收集到数据库中几个月了.我真的不能丢失这些数据.
  3. 我分支我的代码,用NuGet安装EF5,并使用EF Power Tools通过右键单击新的类库项目并选择来从我的数据库生成我的模型Entity Framework | Reverse engineer code first.
  4. 我能够顺利地重新引用我的新项目,将我的项目转换为使用新的DbContext而不是ObjectContext,并删除了保存旧模型的EF4类库.该计划效果很好!

现在,我想尝试自动迁移,我在Ruby on Rails中有一些经验.这是我做的:

  1. Enable-Migrations.由于连接字符串和app.config被使用而有点麻烦,但最终得到了它.但是,这个MSDN页面说这应该自动生成第一次迁移,以使我达到我已经到达的程度.它没有.
  2. 跑来Add-Migration InitialSchema完成第1步中没有自动完成的工作.
  3. 向我的某个模型对象添加了一个属性,然后尝试运行Add-Migration AddSerialToLogEntries,并显示:

无法生成显式迁移,因为以下显式迁移尚未处理:[201307190100268_InitialSchema].在尝试生成新的显式迁移之前应用挂起的显式迁移.

尝试在我现有的数据库上应用迁移失败,这并不奇怪.

我上面提到的其他答案基本上说我运气不好,但就像我说的那些是旧版本的实体框架.我有什么选择吗?

在写这个问题时,我想我可以使用SQL Server Management Studio将我的数据导出到SQL脚本,删除整个数据库,让EF创建它,然后运行脚本来重新获取我的数据......我会在明天有空的时候尝试,但我想听听是否还有其他选择,因为我不是100%肯定会工作,并且不愿意在流程中插入的数据中出现任何错误.

.net c# ef-database-first ef-migrations entity-framework-5

8
推荐指数
1
解决办法
3504
查看次数

实体框架 - 通过更改外键来更新关系

我有以下两个模型和DbContext:

    public class TestDbContext : DbContext
    {
        public IDbSet<Person> People { get; set; }
        public IDbSet<Car> Cars { get; set; }
    }

    public class Person
    {
        public Person()
        {
            ID = Guid.NewGuid();
        }

        public Guid ID { get; set; }
        public string Name { get; set; }
        public virtual List<Car> Cars { get; set; }
    }

    public class Car
    {
        public Car()
        {
           ID = Guid.NewGuid();
        }

        public Guid ID { get; set; }
        public string Name { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# orm entity-framework relational-database entity-framework-5

8
推荐指数
1
解决办法
2万
查看次数

我应该如何从每个对象中禁用Entity Framework表引用(外部)列表?

我正在使用Sqlite数据库System.Data.SQLite 1.0.92 这里有2个表:


表人:

PERSONID

PERSONNAME


表学生:

学生卡

PersonId(参考表人FK)

StudentNo


现在每次我在EF5中获得Persons Collection:

using (var ctx = new myEntities)
{
  AllPersons = ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)

还有AllPersons.student集合将包含在结果中;

但我不需要它.当然这只是一个例子,有很多大表有这么多的引用,因此它总是存在性能问题.

所以我试图不让它出现在我的结果中.所以我改变它:

using (var ctx = new myEntities)
{
      ctx.Configuration.ProxyCreationEnabled = false;
      ctx.Configuration.LazyLoadingEnabled = false;
      AllPersons= ctx.Persons.ToList();
}
Run Code Online (Sandbox Code Playgroud)

现在很好,因为AllPersons.student收集将永远null

但现在我发现:如果我和同学一起学习:

using (var ctx = new myEntities)
{
    ctx.Configuration.ProxyCreationEnabled = false;
    ctx.Configuration.LazyLoadingEnabled = false;
    AllPersons= ctx.Persons.ToList();
    AllStudents = ctx.Student.ToList();
}
Run Code Online (Sandbox Code Playgroud)

现在参考仍然包括在内.

那么在这种情况下,有没有让参考包含在任何时间?谢谢.


更新 …

c# .net-4.0 system.data.sqlite entity-framework-5

8
推荐指数
1
解决办法
4665
查看次数