首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >edmx映射问题

edmx映射问题
EN

Stack Overflow用户
提问于 2011-04-16 23:51:47
回答 2查看 2.3K关注 0票数 0

我有一个分支表,其中包含:

company_id,is_deleted,branch_id,branch_name,branch_code

company_id -用于确定哪个公司拥有分公司。

is_deleted -在逻辑上删除is_deleted=true的行,并且我不想在查询中返回它们。

我得把这些字段映射到班组。班级科有下列成员:

BranchId,BranchName,BranchCode

  1. 应该添加IsDeleted成员以映射is_deleted字段吗?如果不映射此字段,我可以使用is_deleted=true筛选行吗?
  2. 应该添加CompanyId成员以映射company_id字段吗?我有许多company_id字段的表,因为它决定由哪个公司拥有行。在映射这些表时,我能阻止添加CompanyId成员吗?插入时,我需要提供CompanyId -我确实更喜欢外部地提供它,而不是从分支对象。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-17 15:13:47

现在您有了一个具体的示例,因此我们可以继续从your previous question进行讨论,其中我描述了一些关于映射到现有对象的基本信息。

为了映射

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

这是可能的。这称为条件映射,其中is_delete列将用作映射中的筛选器。它有正反两方面:

优点:

  • 每次查询实体集时都会应用过滤器,包括延迟加载和急切加载。你永远不会得到一个有is_deleted = 1.

的实体

缺点:

  • 您不能将is_deleted映射为实体中的属性。这是用于支持条件映射、每个层次结构继承的表和独立关联的所有列的一个全局劣势--它们不能作为属性公开。那么,如果您没有公开该列,并且无法在应用程序中设置它,您将如何软删除您的实体?唯一的解决方案是映射为删除实体操作的存储过程- btw。如果您想要执行软/逻辑删除,这可能是最好的解决方案,因为否则偶然调用上下文中的DeleteObject或一组将执行硬删除的DeleteObject无法将多个条件实体映射到同一个表。这意味着您不能有条件地映射未删除和已删除的实体。这可以由每个层次结构inheritance.

的表来处理。

顺便说一句。如我所知,这在DbContext API中是不可用的(EF4.1)。

为了映射

字段,我应该添加CompanyId成员吗?我有许多带有company_id字段的表,因为它决定哪一家公司拥有该行。在映射这些表时,我能阻止添加CompanyId成员吗?当插入时,我需要提供CompanyId -我确实更喜欢从外部而不是从分支对象提供它。

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

为了避免某些问题,EFv4引入了外键关联,其中依赖实体不仅具有导航属性,而且还具有外键属性(您的country_id)。您可以简单地通过使用相关国家的id分配此属性来创建关系。

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

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

现在的例子,也将显示一些细节,你昨天问我。此示例显示了以下特性:

在映射details)

  • Independent关联时,
  • 条件映射( is_deleted =0)(我已经描述了how to change Independent association to Foreign key association)。如果要从现有数据库创建模型,则可以在更新向导中的模型中检查包含外键列,它将在概念模型中的model.
  • Navigation属性的整个relation
  • Renaming属性中使用外键关联而不是独立的关联(检查映射详细信息,其中很好的名称映射到Id属性设置器的数据库names)
  • Changing可访问性)。我已经在POCO objects.
  • Support模板中需要这样做了,但是对于延迟加载的自定义业务properties.
  • Support必须做同样的工作-检查业务对象导航代码中用于跟踪代理的虚拟关键字-检查业务对象标量属性代码中使用的虚拟关键字。

相关映射的业务对象如下所示:

代码语言:javascript
复制
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; }
}

使用这些自定义业务对象的上下文如下所示:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-04-17 02:51:46

  1. 不,如果要在字段上执行类似过滤器之类的操作,则需要该字段是可见的,除非您使用存储过程。
  2. --我不太明白这一点。如果您需要在插入时使用company_id,为什么不希望它可见?如果它在那里不会有什么伤害的。:)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5690469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档