EF Core 模型中导航属性的必要性

Jac*_*row 5 c# sql-server entity-framework ef-core-2.1

假设在我们的项目中,我们使用 C# 和 MsSQL,并且我们有一个Products包含两列的表 ( ID, Name)

有一天,我们决定保存 给出的产品信息Company1,因此我们创建了一个新表ProductInfoFromCompany1,因为它有自定义列 ( ProductID, Price, CurrentScore)

第二天,我们同意了Company2,现在我们也需要保存他们的数据。因此,新表 ->ProductInfoFromCompany2具有不同的列 ( ProductID, Year, Rating)

另一天,我们同意Company3等等......

所以,我们不知道新公司给出的数据会是什么样子。这就是为什么我们需要创建一个新表,因为如果我们使用一个Details表,它会太宽并且有大量空列

在 Entity Framework Core 中,我们有以下模型:

public class ProductInfoFromCompany1
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public decimal Price { get; set; }
    public double CurrentScore { get; set; }

    public Product Product { get; set; }
}

public class ProductInfoFromCompany2
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public int Year { get; set; }
    public double Rating { get; set; }

    public Product Product { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    //Do we need these navigation properties in this class?
    //public ProductInfoFromCompany1 ProductInfoFromCompany1 { get; set; } 
    //public ProductInfoFromCompany2 ProductInfoFromCompany2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

你可以看到我的问题在课堂上有评论Product

我们需要在Product类中添加导航属性吗?

我问的原因是,在我读过的所有书籍或文档中,人们都使用导航属性,但在这种情况下,它违反了开闭原则,因为每当我们添加新公司时,我们也需要修改Product类。

PS如果我们想要查询ProductInfoFromCompany1数据并且我们有产品Id,我们可以简单地从 开始查询ProductInfoFromCompany1,就像这样

var info = _db.ProductInfoesFromCompany1.Where(c=>c.ProductId == productId);
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 5

我们需要在Product类中添加导航属性吗?

如果您需要或不需要什么, 您是唯一可以回答问题的人。

如果问题是EF Core 是否需要导航属性,答案是否定的。参考:关系 - 单一导航属性EF Core 文档主题:

仅包含一个导航属性(无反向导航,也无外键属性)就足以建立一种按惯例定义的关系。

事实上,EF Core 流畅的 API 和影子属性允许在没有任何导航或 FK 属性的情况下定义关系。它有多大用处是另一个故事了。要点(这是我读到的问题)是它们都不是强制性的。

当然,缺少导航属性会对您可以创建的 LINQ 查询类型施加一些限制 - 就像您所说的那样,您无法启动查询Product并对其应用筛选器ProductInfoFromCompany1,也无法急切/显式/延迟加载它。

但是,如果您不需要所有这些,例如正如您所说,您可以从 开始构建查询ProductInfoFromCompany1,然后省略 中 的导航属性Product就完全没问题了。