当实体的表还不存在时,实体框架的行为是啥?

Posted

技术标签:

【中文标题】当实体的表还不存在时,实体框架的行为是啥?【英文标题】:What is the behavior of entity framework when a table does not exist yet for an entity?当实体的表还不存在时,实体框架的行为是什么? 【发布时间】:2019-04-08 17:24:39 【问题描述】:

我们正在与软件领域的多人合作。因此,我们发现并行工作很方便。因此,正在添加实体的 C# 代码,同时正在创建表定义(db first 方法)。

我的问题是,这个 MyEntity 和 DbSet 是否可以已经添加到上下文中的 C# 代码中,而不会 EF 引发异常,因为 DB 表还没有在数据库中。这将允许 C# 代码开发同时继续(创建存储库、提供程序、验证等)。当然是在 C# 代码中没有使用 DbSet 的情况下。

那么 EF 是否可以将 DbSet 作为上下文的一部分,而数据库中尚不存在 MyEntity 的表?

【问题讨论】:

为什么不简单地尝试一下? 我做到了。请参阅下面的答案。我还没有在互联网上找到这个问题的答案。也许我的搜索效率不高。无论如何,我认为它对将来的参考很有用,可以轻松地与同事分享我的发现,也许对未来的一些搜索者也有用。 好吧,我不是说您的答案没有经过充分研究,但您的问题是。我同意您的问题可能会对未来的读者有所帮助。 【参考方案1】:

是的,您可以将实体添加到上下文中,而无需表格。我用一个测试项目验证了这一点。请参阅下面的代码。它连接到本地机器上的现有数据库。创建上下文没有任何问题。您甚至可以使用Entities 属性、添加实体和SaveChanges()。它将第一次为您创建表格。第二次表不存在时(例如,因为它在创建后被手动删除),它将引发异常。

它会抛出一个异常,因为它在__MigrationHistory中保存了数据库的状态记录。

    using System.Data.Entity;

namespace EntityFrameWorkMissingTableTest

    class Program
    
        static void Main(string[] args)
        
            using (var context = new MyContext("Data Source=localhost;Initial Catalog=MyContext;Integrated Security=True"))
            
                context.Entities.Add(new Entity());
                context.SaveChanges();
            
        

        public class MyContext : DbContext
        
            public MyContext(string connectionString)
                : base(connectionString)
            

            

            public DbSet<Entity> Entities  get; set; 
        

        public class Entity
        
            public int Id  get; set; 
        
    

【讨论】:

将 DbSet 添加到上下文会更改模型哈希,需要迁移/重新创建数据库(如果您使用现有的初始化程序之一)。表的删除是手动完成的,而不是我假设的迁移 Down() 方法,这意味着模型哈希匹配,但不匹配 db 模式,当 EF 尝试访问已删除的表时导致异常。

以上是关于当实体的表还不存在时,实体框架的行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章

实体框架6在不需要时复数表名

当我不知道记录是不是存在时,如何使用实体框架进行合并?

实体框架存在部分自动生成的复合键问题

实体框架:更新实体,如果不存在则添加

仅当实体尚不存在时,我是不是可以在 CloudFormation 中设置属性?

实体框架 ORM 不创建模型/表 [关闭]