首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实体框架具有附加列的多对多

实体框架具有附加列的多对多
EN

Stack Overflow用户
提问于 2017-03-09 09:45:55
回答 1查看 67关注 0票数 2

我有两门课:

代码语言:javascript
运行
复制
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就不会意识到实际设置了哪种类型的连接(表行对它们来说是相同的)。因此,我必须创建一个具有鉴别器的链接类,如下所示:

代码语言:javascript
运行
复制
public class AddressMessageLink
{
    public int LinkType { get; set; }
    public Guid AddressId { get; set; }
    public Guid MessageId { get; set; }
} 

但是它也不能工作,因为我不能设置链接类型/所以我必须在这里使用TPH:

代码语言:javascript
运行
复制
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; }
}

使用复合键:

代码语言:javascript
运行
复制
HasKey(x=>new {x.AddressId, x.MessageId, x.LinkType});

但也不起作用,因为EF:

“外键组件AddressId不是ToAddressMessageLink类型上声明的属性”。

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

在这种情况下我能做什么?

EN

回答 1

Stack Overflow用户

发布于 2017-03-09 09:57:46

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

代码语言:javascript
运行
复制
public class AddressMessageLink
{
    public int LinkType { get; set; }
    public Guid AddressId { get; set; }
    public Guid MessageId { get; set; }
} 

但是你不能加入虚拟属性。所以你必须这样做。

在您的表中定义:

代码语言:javascript
运行
复制
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对象中:

代码语言:javascript
运行
复制
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; }
} 

它会把你的桌子连到很多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42691857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档