Linq将Sql继承映射到多个表

时间:2010-03-02 04:07:06

标签: linq-to-sql database-design

我在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的单独表中,或者我是否必须将它们全部合并到一个表中?只要没有太多(一些对象类型甚至可以共享某些字段),在一个表中有一些额外的字段一定是不好的吗?

2 个答案:

答案 0 :(得分:4)

Linq to SQL不支持使用鉴别器进行多表继承,即使 在许多情况下是最好的设计(它是最正常化的)。

您必须使用关联来实现它。如果使用将其转换为基于继承的域模型的映射层,则可以更轻松地在更高层进行管理。

答案 1 :(得分:2)

我知道这个问题已经解决了,但是我刚遇到同样的问题,我想分享一下我做的事情:

只需从继承的类中删除[Table]属性即可。这是非常合乎逻辑的,因为我们在泛型类中定义了一种存储所有子类型的方法(具有歧视性的属性)。

也许这将有助于将来。