1

我正在使用 EF5 和代码优先。

我有一个名为 FooBase 的抽象基类。Foo1 和 Foo2 都继承自 FooBase。我使用基于名为 Bar 的鉴别器的 EF 映射配置。因此,如果 Bar = someValue,则创建 Foo1... 如果 Bar 是 anotherValue,则创建 Foo2。

由于 Bar 是一个鉴别器,我无法将它作为任何 Foo 类的属性访问。

我现在需要将 Foo1 的实例转换为 Foo2。我使用反射并将属性移动到新实例,包括 Foo1 的键值。这是一个完全相同的副本,只是它是不同的类型。我将 EntityState 更改为已修改并保存到数据库。

但是,数据库中的鉴别器值没有得到更新。它仍然保持与 Foo1 相同的值。

我可以猜测,由于实体仅设置为修改,EF 不会费心检查鉴别器。

有谁知道解决这个问题的方法?

4

1 回答 1

2

您不能将现有实例更改为另一种类型。与键值关联的实体的类型是不可变的。如果要从 Foo1 创建 Foo2 ,则需要使用新键值创建一个新实例并将其插入数据库。只需修改将始终保留密钥和鉴别器。

如果您真的需要更改类型并保留密钥继承不是您的解决方案。将键视为等同于引用,将鉴别器视为等同于 .NET 中的类型 - 您无法更改现有引用的类型。

于 2012-11-21T09:21:33.297 回答