eachspecifictypeoftable(TPC)inentityframework6为了避免使用TablePerHierarchy(TPH),我一直在研究如何在我的数据库模型中最好地实现每个具体类表(TPC)继承。我看到了官方文档和这篇文章。下面是一些具有一些简单继承的模拟类。公共类BaseEntity{publicBaseEntity(){ModifiedDateTime=DateTime.Now;}[Key][DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]publicintId{get;放;}publicDateTimeModifiedDateTime{get;放;}}publicclassPerson:}publicstringLastName{get;放;}}publicclassBusiness:BaseEntity{publicstringName{get;放;}公共字符串位置{得到;放;根据两篇文章TheDbModelBuilderconfigurationusedbytheexamplesin.modelBuilder.Entity().Property(c=>c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);modelBuilder.Entity().Map(m=>{m.MapInheritedProperties();m.ToTable("Person");});modelBuilder.Entity().Map(m=>{m.MapInheritedProperties();m.ToTable("业务");});应用程序成功运行,但当我返回数据库时,我发现了三(3)个表,而不是我期望找到的两(2)个表。经过一些测试,似乎创建了“BaseEntity”表,但从未使用过。除了这个空的孤儿表之外,一切似乎都运行良好。我弄乱了DbModelBuilder配置,最后删除了给出预期结果的“BaseEntity”配置;两(2)个表,每个表都具有正确的属性并且运行良好。我做了最后一个测试,删除了所有DbModelBuilder配置并仅包含“Person”和“Business”的两(2)个DbSet属性,然后再次测试。公共DbSetPeople{get;放;}publicDbSet企业{get;放;令我惊讶的是,项目构建,进入数据库,并创建了两个具有所有类属性的表,包括从“BaseEntity”类属性继承。我可以毫无问题地进行CRUD操作。跑了很多次测试,发现最后测试没有问题,无法重现两篇文章警告的duplicatekey错误。已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。我很好奇为什么这些示例使用MapInheritedProperties属性;这是一种过时的方法吗?为什么这两个示例都说包含“BaseEntity”的配置属性,但包含DbSet属性或“BaseEntity”类的任何DbModelBuilder配置都会导致创建未使用的表。关于文章警告的唯一关键错误;我无法重现该错误,我已经使用主键多次测试了数据库生成的int和数据库生成的guid。有关此错误的信息是否已过时,或者是否存在我可以运行以产生所述错误的测试?为了简化这一点,我已经移动了必要的代码以强制TablePerConcrete开源。其目的是允许通常仅在Fluent界面中可用的功能(您必须将大量代码传播到Db类的OnModelCreating方法中)迁移到基于属性的功能。它允许您执行类似以下操作:[TablePerConcrete]publicclassMySubclassTable:MyParentClassEntity强制执行TPC,而不管EF可能决定从您的父/子关系中推断出什么。这里一个有趣的挑战是,有时EF会搞砸继承的Id属性,将其设置为填充显式值而不是数据库生成的值。您可以通过让父类实现接口IId(它只是说:它有一个Id属性)然后用[ForcePKId]标记子类来确保子类不会这样做。publicclassMyParentClassEntity:IId{publicintId{get;放;}。..[TablePerConcrete][ForcePKId]publicclassMySubclassTable:MyParentClassEntity{//此处不需要PK/Id属性,它已被继承并将用作//开始为您处理所有这些的代码非常简单-只需添加几行到您的Db类:publicclassDb:DbContext{。..protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){varmodelsProject=Assembly.GetExecutingAssembly();B9DbExtender.New().Extend(modelBuilder,modelsProject);您可以通过以下两种方式之一访问它:通过gist将所有相关类复制粘贴到一个文件中,此处:https://gist.github.com/b9chris/8efd30687d554d1ceeb3fee359c179f9通过库,我们的Brass9.Data,我们正在发布开源。它还具有许多其他EF6工具,例如数据迁移。它也更有条理,将类拆分为您通常期望的单独文件:https://github.com/b9chris/Brass9.Data我使用映射类,但没关系。我是这样解决的:HasKey(p=>p.Id);Property(p=>p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);}}记住——基类必须是抽象的。以上就是C#学习教程:Entityframework6中各个具体类型表(TPC)继承(EF6)分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多多关注~本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
