gpt4 book ai didi

entity-framework - EF Core 中具有复合键的外键

转载 作者:行者123 更新时间:2023-12-01 12:08:17 28 4
gpt4 key购买 nike

我有以下类(class):

    public class ProductAttribute 
{
public Guid ProductId { get; set; }

public Guid AttributeId { get; set; }

public List<ProductAttributeValue> Values { get; set; }

public object[] GetKeys()
{
return new object[] {ProductId, AttributeId};
}
}

public class Product
{
public Guid Id { get; set; }

public string Name { get; set; }
}

public class Attribute
{
public Guid Id { get; set; }

public string Name { get; set; }
}

public class ProductAttributeValue
{
public Guid Id { get; set; }

public string Name { get; set; }
}

在原始情况下 Product 和 Attribute 是 AggregateRoot 所以我想通过属性引用跳过导航。值是一个简单的实体,但我需要它作为我的 ProductAttribute 类中的列表引用,因为您看到该类具有复合键。但我想要与 ProductAttribute 之间的级联删除的必需关系
和产品属性值。

这个项目是外部模块,所以我流畅的 API 配置是在目标应用程序 DbContext OnModelCreating 中调用的扩展。我应该配置每个属性和引用,否则不起作用。
        builder.Entity<ProductAttribute>(b =>
{
b.ToTable("ProductAttributes");

b.HasKey(x => new {x.ProductId, x.AttributeId});

//I should config ProductAttributeValue one-to-many manually here
}

builder.Entity<Product>(b =>
{
b.ToTable("Products");

b.HasKey(x => x.Id);
}

builder.Entity<Attribute>(b =>
{
b.ToTable("Attributes");

b.HasKey(x => x.Id);
}

builder.Entity<ProductAttributeValue>(b =>
{
b.ToTable("ProductAttributeValues");

b.HasKey(x => x.Id);

//I should config ProductAttribute many-to-one manually here
}

如何为 ProductAttribute 实体配置 Fluent API 以传递此场景?

最佳答案

写下您的ProductAttribute配置如下:

modelBuilder.Entity<ProductAttribute>(b =>
{
b.ToTable("ProductAttributes");

b.HasKey(x => new {x.ProductId, x.AttributeId});

b.HasMany(pa => pa.Values).WithOne().IsRequired();
});

但存在可读性问题。这将添加列 ProductAttributeProductIdProductAttributeAttributeId作为表的复合外键 ProductAttributeValues对于 shadow property .如果要在表 ProductAttributeValues 中创建复合外键更具可读性,然后您可以更新您的模型 ProductAttributeValue模型类如下:
public class ProductAttributeValue
{
public Guid Id { get; set; }

public Guid ProductId { get; set; }

public Guid AttributeId { get; set; }

public string Name { get; set; }
}

然后更新 ProductAttribute配置如下:
modelBuilder.Entity<ProductAttribute>(b =>
{
b.ToTable("ProductAttributes");

b.HasKey(x => new {x.ProductId, x.AttributeId});

b.HasMany(pa => pa.Values).WithOne().HasForeignKey(pa => new {pa.ProductId, pa.AttributeId});
});

现在表中的复合外键 ProductAttributeValues将生成为 ProductIdAttributeId .

谢谢你。

关于entity-framework - EF Core 中具有复合键的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54441615/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com