我有两门课:
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放入派生类中,则无法设置键,因为基类中没有它的组件。
在这种情况下我能做什么?
发布于 2017-03-09 09:57:46
如果你必须要连接的类,你需要创建一个类来连接你的两个表。你在那里做到了:
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; }
} 它会把你的桌子连到很多。
https://stackoverflow.com/questions/42691857
复制相似问题