【问题标题】: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 的表?

【问题讨论】:

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

标签: c# database entity-framework dbset db-first


【解决方案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 尝试访问已删除的表时导致异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2018-02-24
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多