我正在使用EF5和Code-First。
我有一个名为FooBase的抽象基类。 Foo1和Foo2都继承自FooBase。我使用基于名为Bar的Discriminator的EF映射配置。因此,如果Bar = someValue,则创建Foo1 ...如果Bar是anotherValue,则创建Foo2。
由于Bar是一个鉴别器,我无法在任何Foo类上访问它。
我现在需要将Foo1的实例转换为Foo2。我使用反射并将属性移动到新实例,包括Foo1的键值。除了它是一个不同的类型之外,它完全相同。我将EntityState更改为已修改并保存到数据库。
但是,数据库中的鉴别器值未更新。它仍然保持与Foo1相同的值。
我可以猜测,因为enitity只设置为修改,EF不会检查鉴别器。
有没有人知道解决这个问题?
答案 0 :(得分:2)
您无法将现有实例更改为其他类型。与键值关联的实体的类型是不可变的。如果要从Foo1创建Foo2,则需要使用新的键值创建新实例并将其插入数据库。只需修改将始终保持密钥和鉴别器。
如果您真的需要更改类型并保持密钥继承不适合您。认为密钥等同于引用,并且将鉴别器等同于.NET中的类型 - 您无法更改现有引用的类型。