C# 带有附加列的实体框架多对多
我有两门课:C# 带有附加列的实体框架多对多,c#,entity-framework,many-to-many,tph,C#,Entity Framework,Many To Many,Tph,我有两门课: public class Address { public Guid Id { get; set; } public virtual ICollection<ToAddressMessageLink> MessagesTo { get; set; } public virtual ICollection<CopyAddressMessageLink> MessagesCopyTo { get; set; } } public cl
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; }
}
但它也不起作用,因为我无法设置链接类型/
所以我必须在这里使用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; }
}
这将尽可能多地连接您的表。这在thas情况下会起作用,但如果我添加另一个ICollection类型的属性,将导致“关系地址\u MessagesTo”未加载,因为该类型不可用”显示,您想做什么,此类型的另一个属性是什么?在一个对象中只能定义此类型的一个属性。
(公共类地址{public Guid Id{get;set;}公共虚拟ICollection MessageTo{get;set;}公共虚拟ICollection MessageCopyTo{get;set;}}公共类消息{public Guid Id{get;set;}公共虚拟ICollection Address{get;set;}公共虚拟ICollection CopyToAddress{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; }
}
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; }
}