我有两个班级:
public class Address
{
public Guid Id { get; set; }
public virtual ICollection<ToAddressMessageLink> MessagesTo { get; set; }
public virtual ICollection<CopyAddressMessageLink> MessagesCopyTo { get; set; }
}
public class Message
{
public Guid Id { get; set; }
public virtual ICollection<ToAddressMessageLink> To { get; set; }
public virtual ICollection<CopyAddressMessageLink> CopyTo { get; set; }
}
我需要在单个表中保存它们之间的连接。 如果我只是简单地建立多对多关系,那么Ef就不会意识到实际设置了什么类型的连接(表行对于它们来说是相同的)。 所以我必须使用如下的鉴别器创建一个链接类:
public class AddressMessageLink
{
public int LinkType { get; set; }
public Guid AddressId { get; set; }
public Guid MessageId { get; set; }
}
但它也没有因为我无法设置链接类型/ 所以我必须在这里使用TPH:
public abstract class AddressMessageLink
{
public int LinkType { get; set; }
public Guid AddressId { get; set; }
public Guid MessageId { get; set; }
}
public class CopyAddressMessageLink : AddressMessageLink
{
public virtual AddressDto Address { get; set; }
public virtual MessageDto Message { get; set; }
}
public class ToAddressMessageLink : AddressMessageLink
{
public virtual AddressDto Address { get; set; }
public virtual MessageDto Message { get; set; }
}
使用复合键
HasKey(x=>new {x.AddressId, x.MessageId, x.LinkType});
但它也不起作用,因为EF:“外键组件AddressId不是ToAddressMessageLink类型的声明属性”。
如果我将AddressId和MessageId放入派生类中,则无法设置密钥,因为基类中没有它的组件。
这种情况我该怎么办?
答案 0 :(得分:1)
如果你需要连接的类,你需要创建一个类,它将连接你的两个表。你那样做了:
public class AddressMessageLink
{
public int LinkType { get; set; }
public Guid AddressId { get; set; }
public Guid MessageId { get; set; }
}
但是你没有加入虚拟属性。所以你必须这样做。
在表格定义中:
public class Address
{
public Guid Id { get; set; }
public virtual ICollection<AddressMessageLink> AddressMessageLink { get; set; }
}
public class Message
{
public Guid Id { get; set; }
public virtual ICollection<AddressMessageLink> AddressMessageLink { get; set; }
}
在AddressMessageLink
对象中:
public class AddressMessageLink
{
public int LinkType { get; set; }
public Guid AddressId { get; set; }
public Guid MessageId { get; set; }
public virtual Address Address { get; set; }
public virtual Message Message { get; set; }
}
这样可以将您的表格连接到多个。