10

我有一個針對.NET 4.0並使用EF 5.0的項目。將目標框架更改爲4.5(並更新EF 5.0引用以使用.NET 4.5程序集)後,似乎數據註釋不再有效。例如:在針對.NET 4.5之後,EF數據註釋並不「正常」

[Table("ApplicationSession", Schema = "Application")] 
public class ApplicationSessionEntity 
{ 
    [Key, ForeignKey("GenericSession")] 
    public int GenericSessionID { get; set; } 
... 

用於正常工作,但現在在運行時,DbContext拋出InvalidOperationExceptionUnable to determine the principal end of an association...

我可以添加Fluent api調用來解決此問題(並且它),但是它不能識別該表不在「dbo」模式中。再次,我知道Fluent api可以用來解決這個問題,但爲什麼數據註釋突然被忽略?

謝謝!

+1

您是否有對System.ComponentModel.Annotations的引用?註釋已移到.NET Framework 4.5中的此程序集。我認爲可能發生的事情是,您以某種方式使用舊註釋進行註釋編譯,而EF5運行時正在尋找新註釋。你可以按下桌子上的F12,看看它去哪裏檢查。 – Pawel

+0

@Pawel我有一個對System.ComponentModel.DataAnnotations的引用。我相信我們升級到EF 5.0時是必需的。我曾嘗試使用該程序集的.NET 4.0和.NET 4.5版本,它們都表現出相同的行爲。 – Rob

+0

你有沒有對EntityFramework.dll的版本是4.4.0.0的引用? – Pawel

回答

7

在.NET Framework 4.5中,EF註釋已從EF.dll移至System.ComponentModel.Annotations程序集。看起來,即使您的目標是.NET Framework 4.5,您仍然可以在某處找到EntityFramework.dll v4.4.0.0的參考。因此,您的類將使用4.4.0.0程序集中的屬性進行編譯。在運行時,將使用較新的EntityFramework.dll(5.0.0.0),並從System.ComponentModel.DataAnnotations程序集中查找屬性。那些不能被發現,因爲你有EF.dll 4.4.0.0,因此它看起來像屬性被忽略。

+0

謝謝你。我將項目從4.0升級到4.5,並且引用EF 4.4.0.0。我剛剛刪除了對4.4.0.0的引用並運行nuget安裝包。 – formatc

0

確實如果您使用.NET 4.5及更高版本,它已經移到了EF之外。但是,如果你在.NET 4.0中編譯,你會發現DataAnnotations被用作。看代碼內部,你會發現:

#if NET40 

namespace System.ComponentModel.DataAnnotations 
{ 
... 
} 
#endif 

所以...是的,和其他答案一樣,但我想指出這一點!

快樂編碼!