c# - Entity Framework 多对多带有附加列

标签 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:

"The foreign key component AddressId is not a declared property on type ToAddressMessageLink".

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

这种情况我该怎么办?

最佳答案

如果你必须要连接类,你需要创建一个类来连接你的两个表。你在那里做到了:

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/

相关文章:

mysql - 如何最好地查询 "all Y for each X that has a matching Y"的多对多关系

c# - 你调用的对象是空的。我无法解决的错误

c# - 有没有办法通过 pdfsharp 项目修复 Linux 上的 user32.dll 错误?

c# - 使用 LINQ 构建递归层次结构

entity-framework - 带有lambda的Linq to Entities Select子句

c# - 具有动态 Entity.Property 唯一检查的通用 ValidationAttribute(在运行时设置)

entity-framework - Entity Framework 不查询派生类 - DbOfTypeExpression 中的错误

c# - 在 devexpress xtragrid 中单击列标题时选择按列?

C# - NHibernate带来多对多关系的多条记录

mysql - 为多对多表添加默认配置