实体框架6可选的单向关系

时间:2015-10-02 07:29:53

标签: c# entity-framework-6

我有两张桌子:

Client
------------------------
Id           (string) <-- PrimaryKey
Name         (string)
Number       (int)

Department:*
------------------------
Id           (int) <-- Primary key
Name         (string)
ClientNumber (int?)
Client       (Client, virtual)
.....

现在我想创建一个从Departmant到Client的可选关系(使用ClientNumber)。我在Department类(Client)中创建了一个虚拟属性,现在我需要使用EntityTypeConfiguration配置关系。

数据库中配置了无外键,我无法更改数据库。我也无法更改实体(类)客户端。

所以我需要告诉EntityFramework,Department类中的ClientNumber与Client类中的Number属性相关(可选)。

但我无法弄清楚如何告诉EF部门的 ClientNumber 与客户的 Number 属性相关,而不是客户的主键。 (不更改客户端实体类)

编辑:客户端上的 Number 属性对于每个条目都是唯一的。

该关系应该产生如下的sql语句:

SELECT .....
FROM Department D LEFT OUTER JOIN Client C ON (D.ClientNumber = C.Number)

使用Linq中的连接很容易做到这一点,但这样做很棒:

dbContext.Departments.Include(d => d.Client) 

使用包含客户端(如果有)的Department类的虚拟属性

3 个答案:

答案 0 :(得分:1)

作为@Gert Arnold提到这不是“尚未”可能的。 实体框架7将支持此功能。

对于那些希望保持最新的人,这里是功能讨论/投票。

Unique Constraint (i.e. Candidate Key) Support

答案 1 :(得分:0)

抱歉,这是不可能的。 EF中的Valide关系必须在数据库中也有效,换句话说,依赖表必须引用主表中的唯一标识符。否则,系统无法确保每个部门最多只有一个客户端。

答案 2 :(得分:0)

作为解决方法,您是否可以添加ClientId和ClientNumber属性?在确保Client不为null之后,您可以从虚拟Client属性访问ClientNumber:

    public class Client
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public int Number { get; set; }
    }

    public class Department 
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string ClientId { get; set; }

        public virtual Client Client { get; set; }

        [NotMapped]
        public int? ClientNumber {
            get {
                return Client != null ? Client.Number : null;
            }
        }
    }