0

这是我的场景(表格):

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

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

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

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

这一切都很好。我其实很喜欢这种方式。

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

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

我假设必须存在 XREF 实体才能更新它(使用日期和用户 ID),但我真的很喜欢具有导航属性:DepartmentsEmployees,而不是具有导航属性EmployeesDepartmentXREFs

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

谢谢。

4

2 回答 2

1

我不完全确定这是否首先适用于模型,但您可以使用NotMappedAttribute。我特别不确定这是否会解决第三个实体的出现,但这绝对是一条往下看的道路。

更新

环顾四周后,我发现了这个 MSDN 论坛问题,这听起来像是在代码优先之前(我相信通过 fluent API 允许映射表中的列超过两列)并且适合您的问题。

您可以尝试 fluent API,但同样,我不确定这是否会为模型优先解决任何问题。 这是一个很好的堆栈溢出问题,展示了如何使用 fluent api 将列映射在一起。

最后,这是一篇关于您的问题的好文章。

希望这对您有所帮助/澄清。

于 2012-03-23T20:32:41.447 回答
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),并且尚未处理部门已加载的上下文。Department此外,此属性对于添加或删除和之间的关系是无用的Employee

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

于 2012-03-23T22:20:05.860 回答