我有两节课:
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放入派生类中,则无法设置键,因为在基类中没有它的任何组件。
在这种情况下我该怎么办?
最佳答案
如果您必须要连接的类,则需要创建一个将两个表连接起来的类。而您在那做的是:
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/