当实体的表还不存在时,实体框架的行为是啥?
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 尝试访问已删除的表时导致异常。以上是关于当实体的表还不存在时,实体框架的行为是啥?的主要内容,如果未能解决你的问题,请参考以下文章