Linq to sql 到多个表的Linq到Sql继承映射

Linq to sql 到多个表的Linq到Sql继承映射,linq-to-sql,database-design,Linq To Sql,Database Design,我在Linq到Sql的继承映射方面遇到了问题。我用它作为参考,作为基础,听起来不错。然而,它给出的示例是一个单表继承映射。但是,我正在尝试执行多表继承以节省表空间。这可能吗?到目前为止,我已经: [Table(Name="writing_objs")] [InheritanceMapping(Code="T",Type=typeof(ObjectTypeA), IsDefault=true)] // Only default because a default is required [Inhe

我在Linq到Sql的继承映射方面遇到了问题。我用它作为参考,作为基础,听起来不错。然而,它给出的示例是一个单表继承映射。但是,我正在尝试执行多表继承以节省表空间。这可能吗?到目前为止,我已经:

[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将这些字段保存在单独的表中,还是必须将它们全部合并到一个表中?如果一个表中没有太多的字段(某些对象类型甚至可以共享某些字段),那么在一个表中有一些额外字段是否一定不好?

Linq to SQL不支持使用鉴别器的多表继承,尽管在许多情况下这是最好的设计(它是最规范化的)


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

我知道这个问题已经解决,但由于我刚刚遇到相同的问题,我想与大家分享我所做的:

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


也许这会对将来的人有所帮助。

使用映射层将其转换为基于继承的域模型是什么意思?使用继承而不是关联的最初目的是简化ASP.NET MVC模型绑定,因为在一个视图中绑定多个对象似乎有问题。我想我只想弄清楚为什么这不起作用,而不是在实体设计中使用继承。@KallDrexx:在MVC中,不能将多个对象绑定到一个视图。这就是为什么要构建视图模型。除了视图模型之外,域模型也很常见,它是应用程序/业务的“真实”模型、智能、自验证等,不受关系数据库的限制。将数据库对象(Linq到SQL类)直接传递到视图可能适用于非常小的应用程序,但正如您现在发现的,随着应用程序变得越来越大、越来越复杂,这将变得更加困难。好的,我想我明白了。我需要将当前域模型从实际的数据库模式中分离出来,并创建域存储库,将数据库转换为实际的域模型。这是有道理的。谢谢当然,你是否需要取决于你的项目的规模;我不是说“你必须一直这样做”,但在这种情况下,我认为这是值得努力的。如果需要在单个视图中显示来自多个Linq to SQL实体的数据,则肯定需要至少一个域模型或视图模型;域模型可能是一个更好的起点,因为它最终可以不仅仅用于表示。哦,是的,我理解这一点。我可以肯定地看到我将遇到这个问题的其他实例(例如,使用提交实际数据的方式将记录记录到审计表),因此从长远来看,这可能是最好的方法,最好现在就开始分离层,而这仍然很小。