我有两个类:
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:
"The foreign key component AddressId is not a declared property on type ToAddressMessageLink".
如果我将 AddressId
和 MessageId
放入派生类中,我将无法设置 key ,因为基类中没有它的组件。
这种情况我该怎么办?
最佳答案
如果你必须要连接类,你需要创建一个类来连接你的两个表。你在那里做到了:
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; }
}
这将尽可能多地连接您的表格。
关于c# - Entity Framework 多对多带有附加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42691857/