鬆耦合需要一點點的幫助,請如果任何人可以在此提供一些線索。實體框架4.1的實體
我創建這是我工作的罰款代碼優先MVC 3應用程序。我現在正在重構,以儘可能多地去除耦合,因爲我希望稍後在其他各種MVC 3應用程序中使用該域模型。我現在擁有的是一組實體,它們通過規範化數據庫持久化,並通過存儲庫模式進行CRUD編輯。我已經通過控制器的構造函數使用Ninject將DI存儲到DI中,並且正在使用MVC 3項目中的模型來充當DAO。
因此,域內我有一個名爲實體案例,有一個外鍵的另一種情況客戶,看起來像這樣:
public class Case : ICase
{
[Key]
public int CaseId { get; set; }
public string CaseName { get; set; }
public DateTime DateCreated { get; set; }
public IClient Client { get; set; }
}
然後,我有一個接口(接口主要存在將其實現到視圖模型添加我的數據註釋 - 我知道我可以將註釋添加到域對象,但正如我所說我想要在其他應用程序中使用此域模型將具有不同的無處不在的語言。
public interface ICase
{
int CaseId { get; set; }
string CaseName { get; set; }
DateTime DateCreated { get; set; }
IClient Client { get; set; }
}
然後我在MVC 3項目中有我的視圖模型。
public class CaseModel : ICase
{
[HiddenInput(DisplayValue = false)]
int CaseId { get; set; }
[Required(AllowEmptyStrings = false)]
[MaxLength(100)]
string CaseName { get; set; }
[RegularExpression("")]
DateTime DateCreated { get; set; }
IClient Client { get; set; }
}
所以,我的第一個問題是:改變了我的外鍵引用爲客戶到IClient是一個新事物,它返回一個空的對象。當類型是一個具體的類時,它返回正常 - 我假設這是因爲EF4.1試圖創建一個實例IClient。我在這裏完全錯誤還是有辦法解決這個問題?
我(可能否定我的第一個問題)第二個問題是我我也做錯了通過添加數據註解視圖模型繼承我的域實體的接口?我應該使用模型元數據嗎?如果是這樣,我該如何使用元數據,以便我可以在不觸及域的情況下使每個項目的數據註釋都是唯一的?
謝謝!
只是爲了澄清爲什麼解決第二個問題可能會否定我的第一個問題。這些接口存在的唯一原因是視圖模型具有類似於域實體的結構。如果有一種更好的方法來將註釋的元數據添加到駐留在不同程序集中的域實體中,那麼這些接口不需要存在。我可以刪除它們並返回使用我的域實體的具體版本。 –
您不能在實體中使用接口作爲導航引用。這就像在屬性上放置一個'[NotMapped]'屬性,EF簡單地忽略了這個屬性。你必須有一個具體的或抽象的類。僅用於集合,您可以使用像'ICollection'這樣的接口。另一方面'T'必須再次成爲一個班級,而不是一個界面。對於標準收集接口,EF具有默認規則,如何實例化它們:「ICollection - > HashSet '或'IList - > List '等。對於您定製的自定義接口,EF沒有這樣的規則,並且不知道如何實例化這些。 –
Slauma
順便說一下,EF現在高達4.2。 – TrueWill