簡體   English   中英

edmx映射問題

[英]edmx mapping questions

我有一個分支表,其中包含:
company_id,is_deleted,branch_id,branch_name,branch_code

company_id-用於確定哪個公司擁有分支機構。
is_deleted-在邏輯上刪除is_deleted = true的行,我不想在查詢中返回它們。

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

  1. 是否應該添加IsDeleted成員以映射is_deleted字段? 如果不映射此字段,是否可以使用is_deleted = true過濾行?

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

現在,您有了一個具體的示例,以便我們可以從上一個問題繼續進行討論, 在該問題中 ,我描述了一些有關映射到現有對象的基本信息。

是否應該添加IsDeleted成員以映射is_deleted字段? 如果不映射此字段,是否可以使用is_deleted = true過濾行?

有可能的。 這稱為條件映射,其中is_delete列將用作映射中的過濾器。 它具有優點和缺點:

優點:

  • 每當查詢實體集(包括延遲加載和急切加載)時,都會應用該過濾器。 您永遠不會獲得is_deleted = 1的實體。

缺點:

  • 您不能將is_deleted映射為實體中的屬性。 對於用於支持條件映射,按層次結構繼承表和獨立關聯的所有列而言,這是一個全局缺點。它們不能作為屬性公開。 那么,如果您沒有公開該列並且無法在應用程序中進行設置,那么您將如何軟刪除您的實體? 唯一的解決方案是映射到實體刪除操作的存儲過程-btw。 如果要進行軟/邏輯刪除,這可能是最好的解決方案,因為否則,在上下文或集合上意外調用DeleteObject會在數據庫中進行硬刪除。
  • 您不能將多個條件實體映射到同一張表。 這意味着您不能有條件地映射未刪除和刪除的實體。 可以通過表的每個層次結構繼承來處理。

順便說一句。 據我所知,這在DbContext API(EF 4.1)中不可用。

是否應該添加CompanyId成員才能映射company_id字段? 我有許多帶有company_id字段的表,因為它決定了哪家公司擁有該行。 映射這些表時,可以阻止添加CompanyId成員嗎? 插入時,我需要提供CompanyId-我真的更喜歡從外部提供它,而不是從Branch對象提供。

您的數據庫中的公司表和分支表之間有關系嗎? 在這種情況下,您的Branch實體必須與Company實體使用獨立或外鍵關聯。 關聯默認情況下會在兩個相關實體上創建導航屬性,因此您的公司實體將具有相關分支機構的集合,而您的分支機構將具有對其所屬公司的引用。 導航屬性是在對象世界中創建關系的主要方法。 因此,如果您希望分支機構屬於任何公司,則可以將公司分配給分支機構中的財產,也可以將分支機構添加到公司中分支機構的集合中。 這就是理論-使用分離對象時,EF有點復雜。

為了避免出現某些問題,EFv4引入了外鍵關聯,其中從屬實體不僅具有導航屬性,還具有外鍵屬性(您的country_id)。 您可以簡單地通過為該屬性分配相關國家(地區)的ID來創建關系。

我已經回答了描述獨立和外鍵協會之間差異的單獨問題。

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


現在的例子也將顯示您昨天問我的一些細節。 此示例顯示以下功能:

  • 條件映射(在映射詳細信息中is_deleted = 0時)
  • 獨立關聯(我已經描述了如何將“獨立關聯”更改為“外鍵關聯” )。 如果要從現有數據庫創建模型,則可以在“更新”向導中選中“ 在模型包括外鍵列” ,它將在整個模型中使用外鍵關聯而不是獨立關聯。
  • 關系兩側的導航屬性
  • 重命名概念模型中的屬性(檢查好名字映射到數據庫名稱的映射詳細信息)
  • 更改Id屬性設置器的可訪問性。 我已經回答過類似的問題 ,POCO T4模板需要這樣做,但是對於自定義業務對象也必須這樣做。
  • 支持延遲加載-檢查業務對象代碼中使用的虛擬關鍵字是否具有導航屬性。
  • 支持跟蹤代理-檢查業務對象代碼中使用的虛擬關鍵字的標量屬性。

在此處輸入圖片說明

相關的映射業務對象將如下所示:

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; }
}
  1. 不,如果您想對其進行過濾等操作,則需要該字段可見,除非您使用存儲過程。

  2. 我真的不明白這一點。 如果在插入時需要使用company_id,為什么不希望它不可見? 如果有的話,不會傷到任何東西。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM