有一个Linq-To-Sql模型:
abstract class Foo
{
public int Id { get; set; }
public Guid Identifier { get; set; }
public string Data { get; set; }
}
还有一些后代:
sealed class FooInheritor1 : Foo { }
sealed class FooInheritor2 : Foo { }
sealed class FooInheritor3 : Foo { }
我想通过Linq-To-Sql从数据库中检索数据并将其存储回来。
为了实现这一点,我将通过将结果转换为非抽象继承者来查询数据库,如下所示:
var foos = dataContext.Foos.Where(someCondition).Cast<FooInheritor1>().ToArray();
我也想像这样存储一些数据:
dataContext.Foos.InsertOnSubmit(new FooInheritor1());
dataContext.Foos.InsertOnSubmit(new FooInheritor2() { Data = "Hi" });
但是,提交时会引发异常:
System.Data.Linq.dll 中出现“System.NullReferenceException”类型的异常,但未在用户代码中处理。附加信息:对象引用未设置为对象的实例。
我对此进行了谷歌搜索,发现如果我将一些层次结构属性应用于具有指定列的模型, Linq-to-Sql可能会满足我的需求。IsDiscriminator
但它告诉我Guid
类型属性不能是鉴别器列。
然后我在模型上创建了一个类型的虚拟属性,string
并用它标记了它,ColumnAttribute
但是引发了另一个错误,解释我它无法将列插入数据库。事实证明,Linq-to-Sql会尝试这样做并且会失败,除非我也在我的数据库表中创建那个虚拟列。
最后,我如何实现我想要的功能?我如何告诉它我只是希望模型是抽象的(因为它应该是)并且我可以以正确的方式处理它?