标签: 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
查看次数

将db上下文放在静态类库中的优缺点

我们有一个静态类库来处理重复的多上下文任务.将EF db上下文创建为静态类的成员是不好的做法吗?

数据库上下文是出于某种原因而被处理掉的.经常处理它们会使连接池"流动"并且可能(这里我推测)确保表不会保持锁定状态.

所以我在静态类中使用db上下文时遇到麻烦,还是我在思考这个?

entity-framework entity-framework-4 entity-framework-4.1 entity-framework-5

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

标识规范设置为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
查看次数

实体框架 - 使用toTraceString查看Sql

我正在尝试查看Entity Framework 5.0从实体查询生成的生成的sql.在整个Web上(例如)每个人都说要将IQuerable对象强制转换为ObjectQuery对象,然后使用toTraceString()方法返回生成的查询.

但是我一直收到一个无效的案例例外:

    Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'System.Data.Entity.Infrastructure.DbQuery`1[System.String]' to type 'System.Data.Objects.ObjectQuery'.
Run Code Online (Sandbox Code Playgroud)

在Entity Framework 5中执行此操作的新方法是什么?

logging entity-framework generated-sql entity-framework-5

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

实体类型[名称]不是当前上下文的模型的一部分

我使用EF创建模型并使用DbContext 5.X生成器生成其上下文.现在我重命名了我的一个实体的类名.现在当我运行我的代码时,我得到"实体类型Student2不是当前上下文模型的一部分." 错误.

var context = new MyEntities(connectionString);
foreach(var student in context.Students)
{
    Console.WriteLine(class.Name.ToString());
}
Run Code Online (Sandbox Code Playgroud)

在我的数据上下文中.

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

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    // public DbSet<Student> Students { get; set; } -> Origional
    public DbSet<Student2> Student { get; set; } // I renamed Student to Student2
}
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?由于一些冲突,我需要重命名我的班级.

c# poco database-first entity-framework-5

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

实体框架5 - "检测到冲突的变化"

在我们的EF 5应用程序中,当我们在插入或更新时遇到SQL Server死锁错误时,我们会立即再次尝试操作.但是,当我们尝试这样做时,我们会收到以下错误:

"Conflicting changes detected. This may happen when trying to insert multiple entities with the same key."
Run Code Online (Sandbox Code Playgroud)

此错误不是来自SQL Server.这是EF 5错误.我们不会尝试使用相同的密钥插入多个实体.IOW,我们不会尝试插入重复的行.但是,我怀疑这个错误意味着别的东西.但我不完全确定我知道问题是什么.如果我不得不猜测,我会说在第一次尝试时,EF会看到尝试插入实体的位置.它因为死锁而失败.当我们立即再次尝试时,EF认为我们正在尝试使用相同的键再次执行相同的操作,并且不喜欢它.不知道怎么解决这个问题.

entity-framework entity-framework-5

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

通过反射从某些给定字符串创建强类型LINQ查询的最佳方法是什么

我正在使用EF5,工作单元和存储库模式.我想为访问指定用户的数据定义一些限制.在数据库中,我设计了一个表来保存我的实体名称及其属性(称为EntityProperties),另一个表来保存这些属性的值,这些属性称为PropertyValues,每个EntityProperty都有一个或多个PropertyValues.在用户请求数据的业务层中,如果为他定义了任何限制,则应在linq语句中添加一些条件.我所做的是通过'userId'获取实体名称及其属性和值的列表,然后我在linq查询中添加一些'Where'子句.但是,实体名称及其属性的类型为"String",因此我应该使用Reflection来管理它们.但我不知道这一部分,我不知道 知道如何从给定的条件字符串集创建LINQ where子句.例如,假设用户请求列表顺序,用户ID为5.我首先查询这些访问限制表,结果是:

"订单","Id","74"

"秩序","Id","77"

"订单","Id","115"

这意味着该用户只能看到这三个订单,而在Orders表中,我们有更多的订单.所以,如果我想使用LINQ查询来获取订单,例如:

var orders = from order in Context.Orders
Run Code Online (Sandbox Code Playgroud)

我需要把它变成这样的东西:

var orders = from order in Context.Orders
Run Code Online (Sandbox Code Playgroud)

//其中订单ID应为74,77,115

但是,从"Order"和"Id"字符串到Order实体和Id属性需要反射.因此有两个问题:

从字符串中获取强类型的最佳方法是什么?我有更好的方法来做到这一点,表现更好吗?

c# linq reflection design-patterns entity-framework-5

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

无法使用现有数据库运行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
查看次数

EF 6添加包含导航属性的子句

我将尝试在不发布模型中的所有对象的情况下提出这个问题.我有一个有点复杂的查询,但只有两个对象与问题有关.

我有一个用来办公室足球池的网站.所以我的域模型有Team和TeamRecords

这是定义.我删除了对象上的一些不相关的属性.

public class Team
{
    /// <summary>
    /// Team ID
    /// </summary>
    public int TeamID { get; set; }


    /// <summary>
    /// Team Recordproperty
    /// </summary>
    public virtual ICollection<TeamRecord> TeamRecords { get; set; }
}

public class TeamRecord
{

    /// <summary>
    /// Team ID
    /// </summary>
    public int TeamID { get; set; }

    /// <summary>
    /// Team the record belongs to
    /// </summary>
    public virtual Team Team { get; set;}

    /// <summary>
    /// Season ID
    /// </summary>
    public …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework entity-framework-5

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

我应该如何从每个对象中禁用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
查看次数