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; }
}