Linq to sql,继承了重复列

时间:2011-03-17 16:23:32

标签: linq linq-to-sql inheritance mapping

大家。我遇到了linq to sql的问题。

我正在使用System.Data.Linq.Mapping中的属性来映射我的类和表。 我注意到,在我的代码中重复了一些列定义(比如ID)。所以我想把这些定义移到基类。我写过这样的话:

public abstract class BasicEntity
{
    [Column(IsDbGenerated=true, IsPrimaryKey=true)]
    public int ID { get; set; }
}

[Table(Name = "Users")]
public class User : BasicEntity
{
    [Column(Name = "Name")]
    public string Name { get; set; }
}

public class TestDataContext : DataContext
{
    public TestDataContext(string connectionString) : base (connectionString) { }
    public Table<User> Users { get { return this.GetTable<User>(); } }
}

...

{
    TestDataContext context = new TestDataContext(validConnectionString);
    if(context.DatabaseExists())
        context.DeleteDatabase();
    context.CreateDatabase(); // an exception thrown from here
}

因此,当我尝试创建数据库时,我得到了一个System.Data.SqlClient.SqlException,它说:“目标表或视图中不存在名为”ID“的列。” 嗯,显然,这个异常是由我的BasicEntity引起的。

最后,我的问题是:有没有办法继承列定义以删除重复的代码?

要清楚 - 我使用#develop,它没有像VS那样花哨的LINQ2SQL设计器/代码生成器。

非常感谢提前。

2 个答案:

答案 0 :(得分:1)

在LINQ to SQL中,基类和派生类属性必须存在于同一个表中。在您的情况下,我怀疑多个表中存在公共字段。 LINQ to SQL不支持这种映射。您可能需要使用EF进行此类继承映射。

答案 1 :(得分:1)

我遇到了类似的情况,因为我正在使用一个包含8个不同表的数据库,其中包含一个主键和8个外键约束。

所有8个表共享完全相同的列名和外键约束,只有它们的数据字段和它们的主键字段具有不同的列名/类型等。

我想为它创建一个带有实体的SQL Linq DataContext,但我不想在每种类型上定义相同的8列。所以我将它们放在基本类型XYZDataEntryEntity中。

我遇到了这个错误,所以我有了一个想法,我在基类中创建了所有的列虚拟。我在基类中用Column属性标记它们,我只是在derrived类中覆盖它们,比如

    public override int InstitutionID
    {
        get
        {
            return base.InstitutionID;
        }
        set
        {
            base.InstitutionID = value;
        }
    }

然后我收到投诉,因为私人领域不可用,例如

[Column(Storage =“_ XYZStatus”,DbType =“Int NOT NULL =”,Name =“Column_Name_here”)]

_XYZStatus不可用,我想,是的,因为它在基类中。

所以我让_XYZStatus受到保护而不是私有,所以这个被开发的类可以看到它,就像魔术一样。一切正常。

当然我必须在每个类中覆盖相同的8个属性才能使它工作,但我只需要在基类中对它们进行更改,并且它至少将它们全部绑定到相同的基类并且相同的8属性。