我對實體框架相當陌生,但我使用它的越多,我越喜歡它。但是現在我的激情處於危險之中,因爲我正在爲一個已經讓我把頭撞在牆上的問題感到困惑。實體框架繼承不同的程序集
的問題如下:
我使用實體框架5.0由表每層次代表了我的商業模式代碼優先方法加上繼承。起初,我將所有實體類型都映射到與我的DbContext相同的程序集中(對於TPH和TPT都可以正常工作)。但是因爲它們也包含依賴於其他程序集的邏輯,所以這不是一個好方法,因爲它導致了循環依賴性,因爲這些程序集還需要了解數據訪問層,而數據訪問層又需要知道實體類型它應該映射)。
我通過引入一個CommonObjects項目解決了這個問題,我現在保留了所有的抽象類,並將這些基類的具體後代(包含邏輯等)剝離到特定項目中,這些項目負責他們。 (參見:Circular Dependency Solution)
它編譯好了,一切都看起來符合我想象的方式。 但現在事實證明,實體框架似乎與衍生產品與基類不同的組件中存在矛盾。
在運行時,嘗試訪問的DbContext第一次時,編譯器拋出一個InvalidOperationException說:
抽象類型「Foo.Bar.AbstractClass」沒有映射後代 ,因此不能被映射。從 模型中刪除'Foo.Bar.AbstractClass',或者將從 'Foo.Bar.AbstractClass'派生的一個或多個類型添加到模型中。
因此EF顯然無法找到後代,因爲它只知道基類(它們在CommonObjects項目中),但後代在不同的程序集中。
DbSet<AbstractClass> AbstractClasses { get; set; }
根據這樣一個問題: Entity Framework Code First and Multiple Assemblies 我想下面的代碼添加到我的派生的DbContext的構造函數:
((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(
Assembly.Load("Foo1"));
但是,這並沒有爲我工作。在調試和觀察MetadataWorkspace時,「LoadFromAssembly」方法顯然對MetadataWorkspace及其項目沒有任何影響(沒有類型從程序集Foo1加載)。
我在這裏錯過了什麼?
感謝您提前給出答案。
本