我在我的 EF5 edmx 文件中定义了两级继承结构。
类结构的一个简单示例:
A -> B
A -> C
A -> D -> E
A -> D -> F
粗体类是抽象的(必须继承)。
A 类定义了所有其他类使用的几个属性,每个类都添加了自己的一些数据。
该表有两个鉴别器列,一个用于第一级映射(A -> B、C 或 D),一个用于第二组(D -> E 或 F)。
edmx 没有错误,代码运行良好,我可以实例化任何(非抽象)类并查询数据库并正确返回每个类的所有数据。
但是,当我尝试在数据库中创建新记录时,在最低级别的类(E 和 F)中设置的属性不会保存到表中。
这是我运行的代码示例(VB,抱歉):
Dim _base as A
Select case condition
Case E
dim _concrete as E = _context.A.Create(of E)
_concrete.UniqueProperty = "Value"
_base = _concrete
End Select
_base.BaseLevelProperty = "AnotherValue"
_context.Versions.Add(_base)
If _context.GetValidationErrors.Count > 0 Then Throw New Exception("context errors")
_context.SaveChanges()
当然,对于不同的具体类,还有更多的案例。
这适用于 B 和 C,唯一和基本属性保存到数据库中。但是对于 E 或 F,尽管在调用之前在对象中设置了属性,但savechanges
它们的值不会进入数据库,只有 NULL 出现在数据应该在的列中。
奇怪的是,如果我手动将数据输入这些列之一并在数据库中查询所有对象,TypeOf E
那么我手动输入的数据就会被正确检索。
这表明我的映射是正确的,对吧?为什么数据会以一种方式而不是另一种方式去?
我知道这是可能的,因为在这个问题中讨论了一个更复杂的版本,但它没有提到与我的问题有关的任何事情。