我在Linq to Sql中继承映射时遇到问题。我使用MSDN作为参考,作为基础听起来不错。但是它提供的示例是单表继承映射。但是,我试图做多表继承来保存表空间。这可能吗?到目前为止,我有:
[Table(Name="writing_objs")]
[InheritanceMapping(Code="T",Type=typeof(ObjectTypeA), IsDefault=true)] // Only default because a default is required
[InheritanceMapping(Code="N",Type=typeof(ObjectTypeb))]
public abstract class WritingObject
{
/* ... */
[Column(Name="obj_tp", IsDiscriminator=true)]
[StringLength(1)]
public string ObjectType { get; set; }
}
然后我定义了不同的对象类型:
[Table(Name="obj_type_a")]
public class ObjectTypeA: WritingObject
{
/* Object Type A fields */
}
问题似乎是我在第二种类型中定义了一个表属性,因为我得到以下异常:
继承子类型'ObjectTypeA'也被声明为根类型。
是否可以将这些字段保存在具有Linq to Sql的单独表中,或者我是否必须将它们全部合并到一个表中?只要没有太多(一些对象类型甚至可以共享某些字段),在一个表中有一些额外的字段一定是不好的吗?
答案 0 :(得分:4)
Linq to SQL不支持使用鉴别器进行多表继承,即使 在许多情况下是最好的设计(它是最正常化的)。
您必须使用关联来实现它。如果使用将其转换为基于继承的域模型的映射层,则可以更轻松地在更高层进行管理。
答案 1 :(得分:2)
我知道这个问题已经解决了,但是我刚遇到同样的问题,我想分享一下我做的事情:
只需从继承的类中删除[Table]
属性即可。这是非常合乎逻辑的,因为我们在泛型类中定义了一种存储所有子类型的方法(具有歧视性的属性)。
也许这将有助于将来。