繁体   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