大家。我遇到了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设计器/代码生成器。
非常感谢提前。
答案 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属性。