Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 使用交叉引用表创建实体模型-EntityFramework 4.1_Entity Framework_Entity Model_Navigational Properties - Fatal编程技术网

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

Entity framework 使用交叉引用表创建实体模型-EntityFramework 4.1,entity-framework,entity-model,navigational-properties,Entity Framework,Entity Model,Navigational Properties,以下是我的方案(表): 当我将这三个表导入EDMX模型时,我得到了两个实体:Employee和Department。实体员工有导航属性部门,实体部门有导航属性员工 这一切都很好。我真的喜欢这样 但是,当我想在外部参照表中添加更多字段时,问题就开始了,例如,我想让DateCreated、UserId字段记录何时进行更改以及由谁进行更改。如果在外部参照表中添加这两个字段,则我的EDMX模型将显示3个图元,而不是两个图元。这不是一个大问题,但由于我已经完成了编码,我正在寻找一种简单的解决方案(避免编码

以下是我的方案(表):

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

这一切都很好。我真的喜欢这样

但是,当我想在外部参照表中添加更多字段时,问题就开始了,例如,我想让DateCreated、UserId字段记录何时进行更改以及由谁进行更改。如果在外部参照表中添加这两个字段,则我的EDMX模型将显示3个图元,而不是两个图元。这不是一个大问题,但由于我已经完成了编码,我正在寻找一种简单的解决方案(避免编码)

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

我假设外部参照实体必须存在才能进行更新(使用日期和用户id),但我真的很喜欢导航属性:部门员工,而不是导航属性员工部门外部参照

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


谢谢。

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

更新

环顾四周后,我发现,这听起来像是在代码优先之前(我相信它允许通过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); }
    }
}