【发布时间】:2019-06-23 19:04:04
【问题描述】:
我有以下课程:
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 之间的级联删除的必需关系
和产品属性值。
这个项目是外部模块,所以我的 fluent 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 以传递此场景?
【问题讨论】:
-
我已经跳过了我的模型构建器配置,因为 SOF
-
“那个班级没有PK”是什么意思? EF Core 需要 PK,因此您可能已经通过 { ProductId, AttributeId } 设置了复合 PK。问题是什么?流畅地定义复合 PK 应该足以让 EF Core 在
ProductAttributeValue中创建可选的阴影复合 FK@ -
@IvanStoev 因为这个项目是一个外部模块,我需要手动创建构建器配置。你能指导我如何在
ProductAttributeValue中手动创建这个阴影吗?提前致谢 -
@CS-Beginner 我仍然不明白您的模型/代码有什么问题(并且根本没有问题)。在 EF Core 中,我们更喜欢约定而不是配置,按照约定,您的模型应该没问题 -
ProductAttributeValue表应该有两个可以为空的 Guid 列形成一个 FK。如果您想与级联删除建立 必需 关系,则应在问题中说明。 -
没错,我想要与级联删除的必需关系。抱歉错过信息。固定的。 @IvanStoev
标签: entity-framework ef-code-first entity-framework-core