所以,现在你有一个具体的例子,所以我们可以在这里我描述有关映射到现有的对象的一些基本信息,讨论继续从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单独的问题。
结论:您必须使用导航属性或外键属性来创建对象之间的关系 - 这两个工件都映射到实体中。
现在的例子,它也会显示你昨天问过我的一些细节。这个例子显示了以下特性:
相关映射的业务对象将是这样的:
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; }
}
这将有助于如果你能发布您当前的EDMX图表,并解释当您导入数据库时Visual Studio为您创建的默认映射有什么问题酶。 – 2011-04-17 01:01:05
下一次,我建议您为每个点放置单个问题,因为这些点不直接相关,并且会增加您获得对他们两个的良好答案的机会。 – 2011-04-17 15:14:52