无法保存Entity Framework Inherited类型

.net entity-framework inheritance savechanges table-per-type

我在我的数据模型中实现了一些每个类型的表继承(基本上有一个BaseEntity类型,包含我的项目的所有基本信息和一个继承自BaseEntity项目的Employer类型)。一切似乎都是正确设置的,当使用实体时(通过ADO.net数据服务或通过Linq到实体),我可以看到Employer类型,事情看起来很好。当我创建一个新的Employer实体并尝试保存它时,问题就开始了。

在上下文中似乎不是.AddToEmployer项(仅限AddObjectAddToBaseEntity )。

如果我使用AddObject("Employer", NewEmployer)我会收到以下错误消息:

找不到EntitySet名称'DataEntities.Employer'。

如果我使用AddToBaseEntity(NewEmployer)我收到一条错误消息:

无法确定相关操作的有效排序。由于外键约束,模型要求orstore生成的值可能存在依赖关系。

我是否错过了设置继承的步骤?是否有一些特定的方法来保存继承的对象?我究竟做错了什么?我假设基本问题是我应该有一个AddToEmployer ,我需要做些什么来暴露它?看起来很奇怪它不是一个选项,因为我可以在客户端看到雇主类型并且可以执行以下操作:

var NewEmployer = new Employer() - 这似乎表明我可以看到雇主类型罚款。

一般承认的答案

我改变了一些事情,并且能够让它发挥作用。我不是特别确定什么是基本问题,但是想发布我做的事情以供参考。

重建表:我从ID / Key列和单个数据列开始重建表。

删除了额外的自动递增字段:我在BaseEntity和雇主上有一个自动递增ID。我删除了雇主上的自动递增ID,只有Employer.BaseEntityID列和外键返回BaseEntity.BaseEntityID。 (这似乎是罪魁祸首,但我认为这是允许的)

不幸的是,这导致了一个问题,即实体框架中的enherited类不能具有导航属性(所有导航属性必须在基础实体上),因此继承将被证明对我们的需求不可用。


热门答案

我的名字是Phani,我在ADO.NET数据服务团队工作。

ResolveNameResolveType方法用于帮助您自定义客户端在发送到服务器的有效负载中写入的类型信息,以及如何实现服务器的响应有效负载。

它们可以帮助您解决客户端上的类型,并且在许多场景中都很有用,例如:

  1. 与服务器相比,实体的类型层次结构在客户端上是不同的。
  2. 服务公开的实体类型参与继承,您希望在客户端上使用派生类型。

ResolveName用于在向服务器发出请求时更改我们在线ResolveName放置的实体的名称。

考虑这个数据模型:在服务器上

public class Employee {
    public int EmployeeID {get;set;}
    public string EmployeeName {get;set;}
}

public class Manager:Employee {
    public List<int> employeesWhoReportToMe {get;set;}
}

当您使用客户端处理Manager实体类型的实例时,在将更改提交到服务器时,我们希望当实体参与继承时,类型信息将出现在有效负载中。

context.AddObject("Employees",ManagerInstance ); <-- add manager instance to the employees set.
context.SaveChanges();

但是,当客户端序列化此有效负载时,它会将“Employee”作为类型名称,而不是服务器上预期的类型名称。因此,您必须在客户端上提供名称解析器,

context.ResolveName = delegate(Type entityType){
    //do what you have to do to resolve the type to the right type of the entity on the server
    return entityType.FullName;
}

类型解析器以相同的方式使用。

context.ResolveType = delegate(string entitySetName){
    //do what you have to do to convert the entitysetName to a type that the client understands
    return Type.GetType(entitySetName);
}



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因