繁体   English   中英

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

[英]Entity Framework 6 optional one way relation

我有两张桌子:

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属性对于每个条目都是唯一的。

该关系应该导致这样的sql语句:

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

使用Linq中的连接很容易做到这一点,但它只是:

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

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

正如@Gert Arnold所提到的,这还不是“可能”。 实体框架7将支持此功能。

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

唯一约束(即候选键)支持

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

作为解决方法,您是否可以添加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;
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM