以下简单的代码示例说明了相关场景。我有一个 Person 实体,它只是映射到数据库中的 Person 表。我正在使用默认的实体对象代码生成器。
public partial class Person { ... }
我有一个从 Person 派生的 PersonDetail 类,其中包含 GUI 所需的一些额外属性。这些属性都不需要保留在数据库中,因此我不想将此类映射到数据库。
public class PersonDetail : Person
{
public int TheGuiNeedsThisInformation { get; set; }
}
我使用 WCF 将 Detail 类的实例发送到 GUI。
我的问题是,如果 GUI 修改了 PersonDetail 实例的某些属性,并将其发送回服务器进行更新,我不能简单地将其附加到我的上下文,因为派生类没有映射到任何表(“映射和找不到 EntityType PersonDetail 的元数据信息”)。我尝试将其映射到与 Person 类映射相同的表,但 EF 会抛出一些有关这种映射的异常。
我设法通过创建 PersonDetail 实例的副本来解决此问题,方法是将其属性值复制到新的 Person 实例,然后将其保存到数据库。但是我想避免额外的工作。我究竟做错了什么?这不可能吗?在 Linq to SQL 中,这就像一个魅力,基本上是开箱即用的。
如果这是不可能的,那么建议的方法是什么来使用一些不需要保留的额外信息来扩展我的实体类? (显而易见的方法是简单地向部分 Person 类添加额外的属性。但是,我不想这样做,因为这样 GUI 永远无法确定额外的属性是否已在服务器上填充。)
更新:感谢您的建议,但是我的主要问题仍然悬而未决:是否可以将基类和派生类(其中派生类没有任何必须保存到数据库的附加属性)映射到相同的表,以便我可以简单地将派生类型的实例附加到我的上下文并像基类型的实例一样保存它?我还无法做到这一点,这让我感到惊讶,因为使用 Linq to SQL 就可以了。
我认为继承不是这个问题的正确答案。 “PersonDetail”真的是一个人吗?
我会选择创建一个 PersonDetail 类,并在分部类中添加一个指向 PersonDetail 类实例的属性。
这样,您可以通过检查属性 != null 来在客户端检查 PersonDetail 是否由服务器设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)