2012-02-12 33 views
28

下面的測試與EF 4.2現在的工作與拋出EF下一個異常4.3實體框架4.3和最小起訂量不能創建的DbContext嘲笑

System.ArgumentException:類型嘲笑必須是接口或者 抽象或非密封類。 ----> System.TypeLoadException: 來自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0, Culture = neutral,PublicKeyToken = null'的類型爲'Castle.Proxies.DbContext43Proxy' 的方法'CallValidateEntity'重寫了一個 在該組件中不可見。

[Test] 
public void CanCreateMoqTest() 
{ 
    // Arrange 
    Mock<DbContext43> mock; 

    // Act 
    mock = new Mock<DbContext43>(); 

    // Assert 
    Assert.NotNull(mock.Object); 
} 

public class DbContext43:DbContext 
{ 
} 

我應該怎麼辦?爲我的DbContext43創建一個接口?

這是4.2和4.3之間的突變嗎?

謝謝!

+4

使用存儲庫和工作單元模式,你不會有這個問題。您也不會將所有代碼都連接到EF。 – TrueWill 2012-02-12 20:47:19

+11

存儲庫與DbContext有時是過度殺傷... – 2012-03-14 01:41:01

+2

我一直在深入包裝我的EF代碼存儲庫模式的路線。您最終創建了自己的數據訪問框架,最終需要更多時間進行維護,而不是我所承認的。除非您正在構建由多個團隊共享的企業框架,並且您有一個致力於維護基礎架構的團隊,否則我建議您不要將EF包裝在存儲庫模式中。 – 2013-06-21 13:03:53

回答

38

感謝您的發現。這個問題是由我們從EF 4.2版本中剝離出來的InternalsVisibleTo屬性引起的,但是留給了EF 4.3。這允許Moq(我們用於測試)查看EntityFramework.dll的內部。然而,由於你的程序集看不到那些內部結構,你最終會遇到異常。

我們計劃在接下來的幾個星期內發佈EF 4.3的補丁,並將剝離InternalsVisibleTo,然後再次使用此版本。

更新:現已在今天發佈的EF 4.3.1(和EF 5.0-beta1)中修復此問題。更新你的NuGet包以獲得修復。有關詳細信息,請參見http://blogs.msdn.com/b/adonet/archive/2012/02/29/ef4-3-1-and-ef5-beta-1-available-on-nuget.aspx

+0

所以,直到那些修復程序來了,我要降級到實體框架4.2 :( – 2012-02-21 13:31:38

+1

非常感謝亞瑟!超出了期望moq問題將得到如此迅速的解決! – 2012-03-02 22:10:18

5

這種異常通常表明您試圖覆蓋的成員不會作爲給定程序集中公共接口的一部分公開(或者可能更精確 - 覆蓋程序集看不到它)。如果我們take a look在的EntityFramework 4.3 CallValidateEntity實現:

internal virtual DbEntityValidationResult CallValidateEntity(
    DbEntityEntry entityEntry, IDictionary<object, object> items) 
{ 
    return this.ValidateEntity(entityEntry, items); 
} 

我們確實注意到,這種方法是internal,並因此落在非可覆蓋類(非重寫考慮沒有InternalsVisibleTo屬性被用於)。這自然是由適當的元數據條目匹配:

Method #20 (06000a03) 
------------------------------------------------------- 
    MethodName: CallValidateEntity (06000A03) 
    Flags  : [Assem] [Virtual] [HideBySig] [NewSlot] (000003c3) 

這是相當不清楚爲什麼起訂量試圖重寫成員......考慮到它不應該看到它在首位。

在界面中包裝上下文並僅公開實際使用的方法是一個可行的選項 - 它應該足以讓您的測試通過。

+0

嗨,關於重建,我做了一些測試,創建了兩個單獨的項目,一個用於ef 4.2的nuget,另一個用於ef 4.3,所以我認爲舊的代碼不是問題。無論如何,困擾我的是,它正在使用ef 4.2 – 2012-02-12 15:07:55

+0

@RodrigoJuarez:你可以使用[ILSpy](http://wiki.sharpdevelop.net/ILSpy.ashx)來檢查EF 4.2'CallValidateEntity'的實現。在EF 4.3中它是內部的,所以它不能被覆蓋。爲什麼Moq試圖這樣做反正超越了我。也許問題在別處。 – 2012-02-12 15:11:21

+0

EF 4.2的代碼是一樣的,我怎樣才能看到元數據?無論如何,我應該在Moq中尋找一些問題嗎?隨着接口我有問題解決,但我很好奇 – 2012-02-12 15:46:28