【问题标题】:Entity Framework - Complex Model using Code First实体框架 - 使用代码优先的复杂模型
【发布时间】:2012-02-23 06:59:55
【问题描述】:

大家好,

我尝试在 POCO 类中创建一个非常具体的数据模型,我尝试了很多不同的方法并访问了很多网站,但似乎没有一个涵盖我的具体示例。

所以我要把这个扔出去,希望有人能帮助我。

我有产品,产品有成分。不过,在我们的业务中,这些产品可能由不同的供应商提供,每个供应商的成分略有不同。

所以我有了我的基类:

public class Product
{  
    public int ProductID { get; set; }
    public string ProductNumber { get; set; }
    public string Description { get; set; }
    public virtual ICollection<Supplier> Suppliers { get; set; }
}

public class Vendor
{
    public int VendorID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Supplier> Suppliers { get; set; }
}

public class Ingredient
{
    public int IngredientID { get; set; }        
    public string Name { get; set; }
}

public class Supplier
{
    public int SupplierID { get; set; }

    public virtual ICollection<Product> Products { get; set; }
    public virtual ICollection<Vendor> Vendors { get; set; }
}

如您所见,我已经意识到我的模型需要一个连接实体,因为我的成分来自产品的特定供应商,我需要一个称为供应商的连接实体(我认为)。

这是我卡住的地方...我的产品可以由一个或多个供应商提供。每个供应商,每个产品,都会有该产品的成分列表

我什至无法通过是否需要加入实体。

如果我能像这样(或类似的东西)导航数据结构,那就太棒了:

articles[1].Vendors[3].Ingredients;

再一次,我对 Entity Framework 的了解还不够,不知道这是否可能。

我现在的做法感觉……不对。做我想做的事的正确方法是什么?我是否需要连接表,或者我可以以某种方式为产品的供应商导航成分,也许使用模型构建器来制作所需的产品->供应商->成分链接?

任何帮助将不胜感激!

编辑: 我也觉得我对Entity Framework的关系思路理解不够。

所以一个产品可以有多个供应商,这是一对多的关系。但是一个供应商可以有很多产品。那么这实际上是多对多吗?

我绝对可以在 SQL Express 服务器上为我想做的事情建模,但我真的很想使用实体框架。我只是需要更好地了解我的建模要求。

【问题讨论】:

  • 看起来ProductSupplierIngredient之间存在三元关系。对吗?
  • 我必须查找三元关系......但我相信如此。 Product 将始终具有一对多 Suppliers(供应商),Supplier 将具有该产品的一对多 ingredients。我还想知道我是否应该携带一套配料并将一组配料与给定产品的供应商联系起来。

标签: entity-framework-4.1 ef-code-first poco


【解决方案1】:

这不是EF的问题。这是常见的实体关系任务。你必须简单地改进你的模型。例如,您可以将Product 分为两个实体:ProductDefinitionProductInstance

public class ProductDefinition
{  
    public int ProductID { get; set; }
    public string ProductNumber { get; set; }
    public string Description { get; set; }
    public virtual ICollection<ProductInstance> Instances { get; set; }
}


public class ProductInstance
{
    public int ProductInstanceID { get; set; }
    public virtual Supplier Supplier { get; set; }
    public virtual ProductDefinition Definition { get; set; }
    public vritual ICollection<Ingredient> Ingredients { get; set; }
}

在您的系统中,您将使用ProductDefinition 而不是原来的Product。这个定义就像一组相同的产品,它指向不同供应商提供的具有不同成分的产品的所有可能制造。

我不知道你的背景,但将不同成分的产品算作“相同”似乎很奇怪。

【讨论】:

  • 现在试试这个模型。将尽快给予反馈。回复您上一条评论:该产品有一个条形码,但在不同地区销售。在每个地区,我们基本上都有不同的供应商代表我们生产该产品。在这里,不同的供应商使用的成分略有不同。它们差别不大,但确实不同,我们需要记录下来。
  • 好的,定义看起来不错,但是如何将记录添加到产品实例中?这是我现在所拥有的:var productInstance = new List&lt;ProductInstance&gt; { new ProductInstance { Definition = context.Products.Find(1), Vendor = context.Vendors.Find(1), Ingredients = new List&lt;Ingredient&gt; { new Ingredient { Name = "Water" }, new Ingredient { Name = "Sugar" } } } 这似乎不起作用,所以我不确定我是否全部理解...
  • 究竟是什么不起作用?看起来您的入门问题是不了解如何使用 EF 基础知识。也许您应该在创建应用程序之前阅读一些教程。
  • 我经历了两个具体的例子:MVC音乐商店;和 Contoso 大学示例。我认为我的问题是我用 SQL 术语而不是 EF 术语思考。我是否需要先用信息填充我的供应商和产品表,然后将其链接到我的 productInstance 表?或者我是否创建一个 productInstance,它会在我保存我的 productInstance 时自动填充我的供应商和产品。向所涉及的实体(如产品、供应商和产品实例)添加某些内容的示例将非常棒。除此之外,您的回答已经对我帮助很大:)
  • 相信我,我已经尝试将两个示例中的原理应用到我的应用程序中,但我就是无法让它发挥作用。
【解决方案2】:

为什么要先用代码,而不是先设计数据库?也许这会容易一些。另外我看不到VendorIngredientProductIngredient 之间的关系

据我了解: 这是一种新产品,当供应商使用其他成分时?

【讨论】:

  • 主要使用 Code First,因为我想学习 Code First。这是一个全新的应用程序。供您理解:不,当供应商使用其他成分时,它不是新产品。它是一种产品,由不同的供应商提供。每个供应商使用的成分略有不同。
  • 最大的问题是我可以看到关系,我只是不知道如何在实体框架中成功地建模该关系
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 2017-01-25
  • 2016-06-03
  • 1970-01-01
  • 2013-06-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多