我有两张桌子:
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类的虚拟属性
答案 0 :(得分:1)
作为@Gert Arnold提到这不是“尚未”可能的。 实体框架7将支持此功能。
对于那些希望保持最新的人,这里是功能讨论/投票。
答案 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;
}
}
}