2

我有两节课:

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 类型的声明属性”。

如果我将AddressIdMessageId放入派生类中,则无法设置键,因为基类中没有它的组件。

这种情况我该怎么办?

4

1 回答 1

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

这将连接你的表多对多。

于 2017-03-09T09:57:46.180 回答