無法保存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);
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因