Entity framework 使用交叉引用表创建实体模型-EntityFramework 4.1
以下是我的方案(表): 当我将这三个表导入EDMX模型时,我得到了两个实体:Employee和Department。实体员工有导航属性部门,实体部门有导航属性员工 这一切都很好。我真的喜欢这样 但是,当我想在外部参照表中添加更多字段时,问题就开始了,例如,我想让DateCreated、UserId字段记录何时进行更改以及由谁进行更改。如果在外部参照表中添加这两个字段,则我的EDMX模型将显示3个图元,而不是两个图元。这不是一个大问题,但由于我已经完成了编码,我正在寻找一种简单的解决方案(避免编码) 问题:是否可以将新字段添加到外部参照(交叉引用)表中并只保留两个实体?如果可以,我将如何更新日期时间和用户ID信息 我假设外部参照实体必须存在才能进行更新(使用日期和用户id),但我真的很喜欢导航属性:部门和员工,而不是导航属性员工部门外部参照 这有中间立场吗?最佳做法是什么Entity framework 使用交叉引用表创建实体模型-EntityFramework 4.1,entity-framework,entity-model,navigational-properties,Entity Framework,Entity Model,Navigational Properties,以下是我的方案(表): 当我将这三个表导入EDMX模型时,我得到了两个实体:Employee和Department。实体员工有导航属性部门,实体部门有导航属性员工 这一切都很好。我真的喜欢这样 但是,当我想在外部参照表中添加更多字段时,问题就开始了,例如,我想让DateCreated、UserId字段记录何时进行更改以及由谁进行更改。如果在外部参照表中添加这两个字段,则我的EDMX模型将显示3个图元,而不是两个图元。这不是一个大问题,但由于我已经完成了编码,我正在寻找一种简单的解决方案(避免编码
谢谢。我不完全确定这是否首先适用于模型,但您可以使用。我特别不确定这是否能解决第三个实体出现的问题,但这绝对是一条不容忽视的道路 更新 环顾四周后,我发现,这听起来像是在代码优先之前(我相信它允许通过fluentapi在映射表中有两列以上)并且适合您的问题 您可以尝试使用fluentapi,但我不确定这是否会首先修复模型的任何问题 最后,
希望这对您有所帮助/澄清。您可以创建一个只读帮助器属性:
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); }
}
}
公共课部
{
//...
公共ICollection EmployeesDepartments{get;set}
//因为这里只有一个getter,所以映射到DB时会忽略该属性
公共雇员人数
{
获取{return EmployeesDepartments.Select(ed=>ed.Employee);}
}
}
但这要求您已经从数据库中加载了员工部门
,包括员工
,或者使用延迟加载(将导航属性标记为虚拟
),并且尚未处理已加载部门的上下文。此外,此属性对于添加或删除部门
和员工
之间的关系无效
无论如何,它要求您编写自定义代码。无法使用自动getter和setter引入属性,并指定一个映射,该映射将以某种方式“跳过”中间实体。当你将属性添加到连接表中时,你的模型就不再有多对多的关系,最好的做法是把它看作是21对多的关系。你的帖子让我读到了关于Fluent API的文章,我甚至不知道它的存在。我会进一步调查的。
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); }
}
}