[英]edmx mapping questions
我有一個分支表,其中包含:
company_id,is_deleted,branch_id,branch_name,branch_code
company_id-用於確定哪個公司擁有分支機構。
is_deleted-在邏輯上刪除is_deleted = true的行,我不想在查詢中返回它們。
我必須將這些字段映射到類Branch。 類分支具有以下成員:
BranchId,BranchName,BranchCode
是否應該添加IsDeleted成員以映射is_deleted字段? 如果不映射此字段,是否可以使用is_deleted = true過濾行?
是否應該添加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來創建關系。
我已經回答了描述獨立和外鍵協會之間差異的單獨問題。
結論:您必須使用導航屬性或外鍵屬性來創建對象之間的關系-這兩個工件都映射在實體中。
現在的例子也將顯示您昨天問我的一些細節。 此示例顯示以下功能:
相關的映射業務對象將如下所示:
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; }
}
不,如果您想對其進行過濾等操作,則需要該字段可見,除非您使用存儲過程。
我真的不明白這一點。 如果在插入時需要使用company_id,為什么不希望它不可見? 如果有的話,不會傷到任何東西。 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.