实体框架多对多附加列

时间:2017-03-09 09:45:55

标签: 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 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放入派生类中,则无法设置密钥,因为基类中没有它的组件。

这种情况我该怎么办?

1 个答案:

答案 0 :(得分:1)

如果你需要连接的类,你需要创建一个类,它将连接你的两个表。你那样做了:

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

这样可以将您的表格连接到多个。