多对多关系实体框架核心db优先

Posted

技术标签:

【中文标题】多对多关系实体框架核心db优先【英文标题】:Many to many relationship entity framework core db first 【发布时间】:2019-05-06 12:28:57 【问题描述】:

我有实体产品和标签。我有两张表之间的多对多关系,所以我有第三张表。

我的产品实体:

public class Product 

    public Guid Id  get; private set; 
    public string Name  get; private set; 
    public List<ProductTags> ProductTags  get; private set; 

我的标签实体:

public class Tag

    public Guid Id  get; private set; 
    public string Description  get; private set; 
    public List<ProductTags> ProductTags  get; private set; 

我的 ProductTags 实体:

public ProductTags

    public Guid ProductId  get; private set; 
    public Product Product  get; private set; 
    public Guid TagId  get; private set; 
    public Tag Tag  get; private set; 

如何使用 Entity Framework Core 获取与我的产品相关的标签?​​

抱歉,我的英语水平很低。

【问题讨论】:

我想这可能会帮助你。 learnentityframeworkcore.com/configuration/… 【参考方案1】:

据我所知,EF Core 2.1.4 的最新版本不支持多对多功能,因为 EF 6.2 已开箱即用。因此,您应该明确拥有第三张表(在您的情况下为 ProductTags)。

您可以找到映射配置示例here

如何获取与产品相关的标签?有很多方法可以做到,但最合适的(使用 EF 和扩展方法)是:

var tagsByProduct = await context.ProductTags
    .Where(item => item.ProductId == 100500)
    .Select(item => item.Tag)
    .ToListAsync();

var tagsByProduct = await context.ProductTags
    .Where(item => item.Product.Name == "ProductName")
    .Select(item => item.Tag)
    .ToListAsync();

var tagsByProduct = await context.ProductTags
    .Where(item => item.Product.Name == "ProductName")
    .Select(item => new  Id = item.Tag.Id, Description = item.Tag.Description )
    .ToListAsync();

取决于你的要求。

此外,您可以显式编写连接,它会更快一些。

【讨论】:

@Evandro G. Santos 如果它适合您并解决您真正的问题,请接受答案。否则,请告诉我,我会改进/扩展它

以上是关于多对多关系实体框架核心db优先的主要内容,如果未能解决你的问题,请参考以下文章

实体框架代码优先,同一张表上的多对多关系

实体框架代码优先多对多不使用 GUID 加载相关实体

实体框架代码优先的多对多关系的最佳方法

删除多对多实体框架

删除多对多实体框架

使用 linq/Entity Framework 查询多对多关系。代码优先