我有两节课:
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
放入派生类中,则无法设置键,因为基类中没有它的组件。
这种情况我该怎么办?