这是我的场景(表格):
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 。
这有中间立场吗?什么是最佳做法?
感谢。
答案 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
)以及部门的上下文已装入尚未处置。此外,此属性对于添加或删除Department
和Employee
之间的关系无用。
无论如何,它要求您编写自定义代码。没有办法引入具有自动getter和setter的属性,并指定一个以某种方式“跳过”您的中间实体的映射。当您向连接表添加属性时,您的模型不再具有多对多关系,最佳实践是将其视为两个一对多关系。