2011-04-16 196 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