所以,現在你有一個具體的例子,所以我們可以在這裏我描述有關映射到現有的對象的一些基本信息,討論繼續從your previous question。
我是否應該添加IsDeleted成員 來映射is_deleted字段?如果我 不會映射此字段,我可以 篩選具有is_deleted = true的行嗎?
這是可能的。它被稱爲條件映射,其中您的is_delete
列將用作映射中的過濾器。它的優點和缺點:
優點:
- 過濾器應用於每次查詢的實體組包括延遲加載和渴望加載時間。你永遠不會得到一個與
is_deleted = 1
實體。
缺點:
- 不能映射
is_deleted
作爲實體的屬性。對於所有用於支持條件映射,每層繼承和獨立關聯的列,這是一個全局缺陷 - 它們不能作爲屬性公開。那麼如果你沒有暴露列並且你不能在應用程序中設置它,你將如何軟刪除你的實體?唯一的解決方案是存儲過程映射到您的實體刪除操作 - 順便說一句。如果你想要進行軟/邏輯刪除,它可能是最好的解決方案,否則上下文或集合上的DeleteObject
的意外調用將在數據庫中進行硬刪除。
- 您無法將多個條件實體映射到同一個表。這意味着您不能有條件地映射未刪除和已刪除的實體。這可以通過按層次繼承的表來處理。
Btw。因爲我知道這在DbContext API(EF 4.1)中不可用。
我應該添加CompanyId成員才能 映射的company_id場?我有 許多表與company_id字段 因爲它決定哪個公司擁有 行。在映射這些表時,我可以防止添加CompanyId 成員嗎?當插入 時,我需要提供CompanyId - 我真的更喜歡將它提供給externaly而不是來自Branch 對象。
您在數據庫中的公司表和分支表之間有關係嗎?在這種情況下,您的Branch
實體必須使用獨立或外鍵與Company
實體關聯。默認情況下,協會會在兩個相關實體上創建導航屬性,以便您的公司實體擁有相關分支的收集,並且您的分支將具有對其所屬公司的引用。導航屬性是如何在對象世界中創建關係的主要方式。因此,如果您希望分公司屬於任何公司,您可以將公司轉讓給分公司的財產,也可以將分公司添加到公司的分公司集合中。這就是理論 - 在使用分離對象時,使用EF稍微複雜一些。
爲避免某些問題EFv4引入了外鍵關聯,其中依賴實體不僅具有導航屬性,而且還具有外鍵屬性(您的country_id)。只需將該屬性分配給相關國家/地區的ID,即可創建關係。
我已經回答了描述differences between Independent and Foreign key associations單獨的問題。
結論:您必須使用導航屬性或外鍵屬性來創建對象之間的關係 - 這兩個工件都映射到實體中。
現在的例子,它也會顯示你昨天問過我的一些細節。這個例子顯示了以下特性:
相關映射的業務對象將是這樣的:
public class Branch
{
public virtual int Id { get; private set; }
public virtual string Name { get; set; }
public virtual string Code { get; set; }
public virtual Company Company { get; set; }
}
public class Company
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<Branch> Branches { get; set; }
}
而且環境中使用這些自定義的業務對象可以是這樣的:
public class Context : ObjectContext
{
public Context()
:base ("name=ModelContainer")
{
Companies = CreateObjectSet<Company>();
Branches = CreateObjectSet<Branch>();
ContextOptions.LazyLoadingEnabled = true;
ContextOptions.ProxyCreationEnabled = true;
}
public ObjectSet<Company> Companies { get; private set; }
public ObjectSet<Branch> Branches { get; private set; }
}
這將有助於如果你能發佈您當前的EDMX圖表,並解釋當您導入數據庫時Visual Studio爲您創建的默認映射有什麼問題酶。 – 2011-04-17 01:01:05
下一次,我建議您爲每個點放置單個問題,因爲這些點不直接相關,並且會增加您獲得對他們兩個的良好答案的機會。 – 2011-04-17 15:14:52