edmx映射问题

时间:2011-04-16 23:51:48

标签: c# .net entity-framework entity-framework-4 mapping

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

company_id - 用于确定哪家公司拥有该分支机构 is_deleted - 逻辑删除了is_deleted = true的行,我不想在查询中返回它们。

我必须将thos字段映射到类Branch。班级分会有以下成员:
BranchId,BranchName,BranchCode

  1. 我应该添加IsDeleted成员以映射is_deleted字段吗?如果我不映射此字段,是否可以使用is_deleted = true过滤行?

  2. 我应该添加CompanyId成员以映射company_id字段吗?我有很多表与company_id字段,因为它决定公司拥有该行。映射这些表时,是否可以阻止添加CompanyId成员?插入时,我需要提供CompanyId - 我更愿意提供外部而不是Branch对象。

2 个答案:

答案 0 :(得分:1)

所以现在你有了一个具体的例子,所以我们可以继续讨论your previous question,其中我描述了一些关于映射到现有对象的基本信息。

  

我应该按顺序添加IsDeleted成员吗?   映射is_deleted字段?我可以吗   如果我,过滤行is_deleted = true   不会映射这个字段?

有可能。它被称为条件映射,其中is_delete列将用作映射中的过滤器。它有利有弊:

优点:

  • 每次查询实体集时都会应用过滤器,包括延迟加载和急切加载。您永远不会获得is_deleted = 1
  • 的实体

缺点:

  • 您无法将is_deleted映射为实体中的属性。对于用于支持条件映射,每个层次结构表继承和独立关联的所有列,这是一个全局性缺点 - 它们不能作为属性公开。那么,如果您没有公开列,并且无法在应用程序中设置它,您将如何软删除您的实体?唯一的解决方案是映射到您的实体的删除操作的存储过程 - 顺便说一句。如果你想进行软/逻辑删除,它可能是最好的解决方案,因为在上下文或集合上意外调用DeleteObject将在数据库中进行硬删除。
  • 您无法将多个条件实体映射到同一个表。这意味着您无法有条件地映射未删除和已删除的实体。这可以通过每个层次结构继承的表来处理。

顺便说一下。据我所知,这在DbContext API(EF 4.1)中不可用。

  

我应该按顺序添加CompanyId会员   映射company_id字段?我有   许多带有company_id字段的表   因为它决定了哪家公司拥有   行。我可以阻止添加CompanyId吗?   映射这些表时的成员?什么时候   插入,我需要提供CompanyId    - 我真的更愿意提供外部而不是分支机构   对象

公司表和数据库中的分支表之间是否存在关联?在这种情况下,您的Branch实体必须使用与Company实体的独立或外键关联。默认情况下,关联会在两个相关实体上创建导航属性,以便您的公司实体将拥有相关分支的集合,并且您的分支将具有对其所属公司的引用。导航属性是如何在对象世界中创建关系的主要方式。因此,如果您希望分支机构属于任何公司,您可以将公司分配给分支机构的财产,也可以将分支机构添加到公司的分支机构集合中。这就是理论 - 当使用分离的对象时,它与EF稍微复杂一点。

为了避免一些问题,EFv4引入了外键关联,其中依赖实体不仅具有导航属性,还具有外键属性(your country_id)。您只需为此属性指定相关国家/地区的ID即可创建关系。

我已经回答了单独的问题differences between Independent and Foreign key associations

结论:您必须使用导航属性或外键属性来创建对象之间的关系 - 这两个工件都映射到实体中。


现在的例子也会显示你昨天问我的一些细节。此示例显示以下功能:

  • 条件映射(当映射详细信息中is_deleted = 0时)
  • 独立协会(我也已经描述过how to change Independent association to Foreign key association)。如果要从现有数据库创建模型,可以在更新向导中检查在模型中包含外键列,它将在整个模型中使用外键关联而不是独立关联。
  • 关系两侧的导航属性
  • 在概念模型中重命名属性(检查映射到数据库名称的映射详细信息)
  • 更改Id属性设置器的可访问性。我已经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; }
}

答案 1 :(得分:0)

  1. 不,除非您使用存储过程,否则如果要对其进行过滤,则需要显示该字段。

  2. 我真的不明白这个。如果在插入时需要使用它,为什么不希望company_id可见?如果它在那里,它不会伤害任何东西。 :)