使用交叉引用表创建实体模型 - EntityFramework 4.1

时间:2012-03-23 19:53:03

标签: entity-framework entity-model navigational-properties

这是我的场景(表格):

Departments
====================
Id (int)
Name (varchar)

Employees
====================
Id (int)
Name (varchar)

EmployeesDepartmentXREFs
====================
EmployeeId (int)
DepartmentId (int)

当我将这3个表导入EDMX模型时,我得到2个实体:Employee和Department。实体员工具有导航属性部门和实体部门具有导航属性员工。

这一切都很好。我其实喜欢这样。

但是,当我想在XREF表中添加更多字段时,问题就出现了,例如,我想要在更改时记录DateCreated,UserId字段以及由谁来记录。如果我在XREF表中添加这两个字段,那么我的EDMX模型将显示3个实体而不是2个。这不是一个大问题,但由于我已经完成了编码,我正在寻找简单的解决方案(避免编码)。

问题:是否可以在XREF(交叉引用)表中添加新字段并仅保留两个实体?如果是,我将如何更新日期时间和用户ID信息?

我认为XREF实体必须存在才能更新它(带有日期和用户ID),但我真的很喜欢导航属性:部门员工< / strong>,与导航属性相比 EmployeesDepartmentXREFs

这有中间立场吗?什么是最佳做法?

感谢。

2 个答案:

答案 0 :(得分:1)

我不完全确定这是否适用于模型,但您可以使用NotMappedAttribute。我特别不确定这是否能解决第三个实体的问题,但这绝对是一条俯视的道路。

<强>更新

环顾四周之后,我发现了this MSDN forum question,这听起来像是在代码优先之前(我相信通过流畅的API允许在映射表中有两列以上)并且适合您的问题。

您可以尝试使用流畅的API,但同样,我不确定这是否会为模型优先解决任何问题。 Here is a good stack overflow question that shows how to use the fluent api to map the columns together.

最后,Here is a good article on your problem.

希望这有助于/澄清一些事情。

答案 1 :(得分:1)

您可以创建一个只读辅助属性:

public class Department
{
    //...
    public ICollection<EmployeesDepartment> EmployeesDepartments { get; set }

    // because here is only a getter the property is ignored for mapping to DB
    public IEnumerable<Employee> Employees
    {
        get { return EmployeesDepartments.Select(ed => ed.Employee); }
    }
}

但是这要求您已经从数据库加载了EmployeesDepartments包括Employee,或者您使用了延迟加载(将导航属性标记为virtual)以及部门的上下文已装入尚未处置。此外,此属性对于添加或删除DepartmentEmployee之间的关系无用。

无论如何,它要求您编写自定义代码。没有办法引入具有自动getter和setter的属性,并指定一个以某种方式“跳过”您的中间实体的映射。当您向连接表添加属性时,您的模型不再具有多对多关系,最佳实践是将其视为两个一对多关系。