2013-04-04 44 views
4

我對實體框架相當陌生,但我使用它的越多,我越喜歡它。但是現在我的激情處於危險之中,因爲我正在爲一個已經讓我把頭撞在牆上的問題感到困惑。實體框架繼承不同的程序集

的問題如下:

我使用實體框架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加載)。

我在這裏錯過了什麼?

感謝您提前給出答案。

回答

1

編輯:這只是勉強可行,是不值得的,如果你正在使用CodeFirst不會在所有的工作。

我遇到了與代碼第一次相同的問題。我嘗試了你的反思方法。這看起來有點不可思議,但是你可以把EF與你的內部課堂相提並論。

internal class ClassToMakeEFHappy : AbstractClass {} 

我剛剛在與AbstractClass定義相同的文件中創建了它,並且它做了訣竅。