[英]Initialization in a Parameterless Constructor (Entity Framework)
我的問題是:
在測試我的代碼時,似乎無法在無參數構造函數中初始化對象。 如果這樣做,實體框架將無法正確加載它們。
加載對象時,此代碼正確加載
abstract public class Channel
{
public long ID { get; protected set; }
public Verification Verification { get; protected set; }
public Channel() { }
}
而此代碼無法正確加載
abstract public class Channel
{
public long ID { get; protected set; }
public Verification Verification { get; protected set; }
public Channel()
{
Verification = new Verification();
}
}
注意:在上面的示例中,我使用的是已經存儲在數據庫中的數據,我沒有重新創建數據,然后為每個示例加載它(我不知道它有什么不同)。
這是具體的派生類:
public class Email : Channel
{
public string Address { get; protected set; }
public Email(string address)
{
Address = address;
}
public Email() : this(string.Empty) { }
}
為了澄清起見,這是我創建,保存和加載實體的方式:
// Creating / saving
using (Context context = new Context())
{
Email email = new Email("person@blah.com");
// Do some stuff with the Verification object
context.Channels.Add(email);
context.SaveChanges(); // EF assigns an ID of 1
}
// Loading
using (Context context = new Context())
{
Email email = context.Find(1); // Using the value of 1 from above
}
當使用上面的“正確加載”構造函數加載時,Verification對象已正確加載-這是我創建/保存的對象。 當使用“未正確加載”構造函數(帶有一些初始化的構造函數)時,Verification對象只是一個“新的”版本(沒有ID為0的代理)。
每一個頁面,但一個我看到說參數構造函數中的對象的初始化是好的,因為EF會妥善盡管初始化它們標識為未修改,並覆蓋那些從數據庫中抽取的值。 我看不到的唯一不能執行此操作的頁面在此處 ,盡管我沒有看到有關如何在無參數構造函數中初始化對象的任何建議。
我希望在無擔保的情況下擁有無參數的構造函數, 而不必創建無用的參數化的構造函數來繞過EF的內部工作方式。 這樣的“朴素”使我喪命。 我對EF的關注越深,任何面向對象的代碼在我眼中的惡化就越多。 = *(
正如我在回答中所說的那樣,相對於真正的域模型,在Entity Framework類模型中,在實體的構造函數中初始化引用導航屬性是一種不好的做法。
但是,是的。。。我們必須在某處初始化參考導航屬性。 那么最好的地方是什么? 我認為信息是:保持簡單。 我認為,應該有可能讓EF入侵EF,將其替換為已實現的默認對象,但這並非微不足道。 這將是意外錯誤的可能來源。
因此,基本上有兩種選擇:
不要初始化它們,設置原始外鍵屬性:
var channel = new Channel { VerificationId = someId };
這可能會進一步傷害域驅動型專家的眼睛,但是EF正式建議使用外鍵關聯 (引用和原始屬性的組合),因為它具有許多優點。
只需在必要時進行更新即可初始化它們。
EF類模型僅遠程類似於域驅動模型。 無法將許多DDD原理應用於它,因為EF模型只是“一個”數據訪問層 。 接受嘗試勝於抗爭。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.