将派生类型映射到EF中的同一张表下面简单的代码示例说明了相关场景。我有一个Person实体,它简单地映射到数据库中的Person表。我正在使用默认的实体对象代码生成器。publicpartialclassPerson{...}我有一个派生自Person的PersonDetail类,它包含GUI所需的一些额外属性。这些属性都不需要保存在数据库中,所以我不想将此类映射到数据库。publicclassPersonDetail:Person{publicintTheGuiNeedsThisInformation{get;放;然后,我使用WCF将详细信息类的一个实例发送到GUI。我的问题是,如果GUI修改了PersonDetail实例的一些属性,并将其发送回服务器进行更新,我不能简单地将它附加到我的上下文,因为派生类没有映射到任何表(“Map并且找不到EntityTypePersonDetail")元数据信息。我试图将它映射到与Person类映射到的同一个表,但是EF抛出了一些关于映射的异常。我通过将其属性值复制到新的Person实例然后将其保存到数据库来创建PersonDetail实例的副本,从而设法解决了这个问题。但我想避免额外的工作。我究竟做错了什么?这不可能吗?在LinqtoSQL中,这就像一个魅力,基本上开箱即用。如果这是不可能的,建议的方法是什么来扩展我的实体类与一些不必保留的附加信息?(显而易见的方法是简单地向Person类的一部分添加额外的属性。但是,我不想这样做,因为GUI无法确定服务器上是否已经填充了额外的属性。)更新:谢谢对于建议,但我的主要问题仍然悬而未决:是否可以将基类和派生类(其中派生类没有任何必须保存到数据库的附加属性)映射到同一个表,以便我可以简单地将派生类型的实例附加到我的上下文并将其保存为就好像它是基类型的实例一样?我还不能这样做,我很惊讶,因为使用LinqtoSQL它可以正常工作。我不认为继承是这个问题的正确答案。“PersonDetail”是一个人吗?我会选择创建一个PersonDetail类并在分部类中添加一个属性指向PersonDetail类的实例。这样你就可以检查客户端是否有服务器设置的PersonDetail,只需检查属性是否为!=空。您可以向类添加属性并使用ModelBuilder为EntityFramework“忽略”它们,看起来您正在进行代码优化开发。对于这些选项,请查看modelBuilder=>publicclassDb:DbContext{publicDbSetMyClasses{get;放;}protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){modelBuilder.Entity().Ignore(x=>x.MyProperty);}}希望这可以帮助!您是否尝试过使用组合而不是继承?公共类PersonViewModel{publicPersonPerson{get;公共诠释?我的视图属性{得到;放;}//...}除非有充分的理由,否则我绝不会将该对象移到您的服务中。对我来说,它就像一个客户端对象。将GUI属性传输到服务器时,无论如何它们都不会存储在数据库中,那有什么意义呢?仅仅获取Person并将其发送到服务器以进行更新是否就足够了?以上就是《C#学习教程:将派生类型映射到EF同一张表》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文来自网络收集,不代表作品如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
