【发布时间】:2022-01-12 14:42:12
【问题描述】:
我的场景:
我有一个产品,它具有在产品实体中声明的各种属性,例如价格、尺寸等。
此外,Product 可以具有 StockRequirements 的集合,即当使用该产品时,StockRequirement 可以耗尽组成 StockItems相应的数量。
在一个用例下,我只想要产品,以便我可以使用核心属性。对于另一个用例,我想要具有 StockRequirements 的产品。
这意味着在检索产品时,我可能会在不同的上下文中使用它。我选择的方法是使用 EF 表拆分。
我有一个 Products 存储库和一个 ProductStockRequirements 存储库。它们指的是同一个独特的产品。
产品存储库将提供仅包含核心详细信息的产品实体。
ProductStockRequirements 存储库将提供 ProductStockRequirements 实体,该实体没有核心详细信息,但有 StockRequirements 列表。
这似乎是一种合理的方法,因此当我只想更改产品的价格时,我不会检索“拥有”的 StockRequirements。同样,如果我只对使用 StockRequirements 感兴趣,那么我不会检索其他核心细节。
实体
class Product
{
public int Id { get; set; }
public string CoreProperty { get; set; }
}
class ProductStockRequirements
{
public int Id { get; set; }
public List<StockRequirement> StockRequirements { get; set; }
}
产品映射
b.ToTable("Products");
b.HasKey(p => p.Id);
b.Property(p => p.CoreProperty).IsRequired();
ProductStockRequirementsMapping
b.ToTable("Products");
b.HasKey(p => p.Id);
b.OwnsMany<StockRequirement>(p => StockRequirements, b =>
{
b.ToTable("StockRequirements");
b.WithOwner().HasForeignKey("ProductId");
}
b.HasOne<Product>()
.WithOne()
.HasForeignKey<ProductStockRequirements>("Id");
运行迁移时,我收到警告:
实体类型“ProductStockRequirements”是可选的依赖项 使用没有任何必需的非共享属性的表共享 可用于识别实体是否存在。如果都可以为空 属性在数据库中包含一个空值,然后是一个对象实例 不会在查询中创建。添加创建所需的属性 其他属性为空值的实例或标记传入的实例 根据需要导航以始终创建实例。
专注于建议:
根据需要标记传入导航以始终创建实例
我试过了:
b.HasOne<Product>()
.WithOne()
.HasForeignKey<ProductStockRequirements>("Id")
.IsRequired();
和
b.HasOne<Product>()
.WithOne()
.IsRequired()
.HasForeignKey<ProductStockRequirements>("Id");
无济于事。
警告似乎不会导致任何不良行为。我所有的测试都通过了。但是,似乎我应该能够创建一个删除此警告的地图,但找不到路。
【问题讨论】: