2011-04-16 194 views
0

我有一個包含一個分支表:
COMPANY_ID,IS_DELETED,branch_id,branch_name,branch_codeEDMX映射問題

COMPANY_ID - 爲了確定哪些公司擁有分公司使用。
is_deleted - 其中is_deleted = true的行被邏輯刪除,我不想在我的查詢中返回它們。

我必須將thos字段映射到class分支。 Branch類具有以下成員:
BranchId,BRANCHNAME,BranchCode

  1. 我應該以映射IS_DELETED場請將isDeleted添加成員?如果我不映射此字段,可以使用is_deleted = true過濾行嗎?

  2. 我應該添加CompanyId成員以映射company_id字段嗎?因爲它決定公司擁有該行,所以我有很多帶有company_id字段的表。映射這些表時,我可以防止添加CompanyId成員嗎?插入時,我需要提供CompanyId - 我真的更喜歡從外部提供它,而不是從Branch對象提供。

+0

這將有助於如果你能發佈您當前的EDMX圖表,並解釋當您導入數據庫時​​Visual Studio爲您創建的默認映射有什麼問題酶。 – 2011-04-17 01:01:05

+0

下一次,我建議您爲每個點放置單個問題,因爲這些點不直接相關,並且會增加您獲得對他們兩個的良好答案的機會。 – 2011-04-17 15:14:52

回答

1

所以,現在你有一個具體的例子,所以我們可以在這裏我描述有關映射到現有的對象的一些基本信息,討論繼續從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單獨的問題。

結論:您必須使用導航屬性或外鍵屬性來創建對象之間的關係 - 這兩個工件都映射到實體中。


現在的例子,它也會顯示你昨天問過我的一些細節。這個例子顯示了以下特性:

  • 條件映射(當映射細節IS_DELETED = 0)
  • 獨立協會(I也已經描述how to change Independent association to Foreign key association)。如果要創建從現有的數據庫,你可以檢查模型在更新嚮導中的模型包括外鍵列,它將使用外鍵關聯,而不是獨立的協會在整個模型。在概念模型中的關係
  • 更名性能兩側
  • 導航性能(檢查哪裏好的名稱映射到數據庫名稱映射的詳細信息)
  • 更改標識屬性setter的可訪問性。我已經在answered similar question這是POCO T4模板所必需的,但必須對自定義業務對象進行相同操作。
  • 支持延遲加載 - 檢查用於導航屬性的業務對象代碼中的虛擬關鍵字。
  • 支持跟蹤代理 - 檢查用於標量屬性的業務對象代碼中的虛擬關鍵字。

enter image description here

相關映射的業務對象將是這樣的:

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; } 
} 
+0

非常感謝你和遲到的迴應(假期)遺憾。我決定將CompanyId保留爲外鍵屬性,並且沒有導航屬性,+保持IsDeleted,以便在代碼中擁有更多的數據控制。 – Naor 2011-04-20 00:37:27

0
  1. 不,你將需要現場可見,如果你想要做的事就像過濾器就可以了,除非你使用存儲過程。

  2. 我真的不明白這一個。如果您在插入時需要使用它,爲什麼不希望company_id可見?如果它在那裏,它不會傷害任何東西。 :)

+0

2.添加CompanyId意味着我需要將其添加到我的所有主要元素,這是很多.. – Naor 2011-04-17 13:13:10