我有两节课:

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/

10-12 22:18