.NET 教程无法理解 .cs 模型文件中某些字段的用途

.NET tutorial cant understand purpose of certain fields in .cs Model files

我一直在关注 ASP.NET - http://www.asp.net/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/create_the_data_access_layer

上的教程

他们从构建数据层开始(该应用程序是一个玩具购物网站,其中每件商品都属于四个类别之一)。因此,他们从构建 "products" 和 "categories" table 开始。产品 table 具有以下代码 -

[ScaffoldColumn(false)]
public int ProductID { get; set; }

[Required, StringLength(100), Display(Name = "Name")]
public string ProductName { get; set; }

[Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
public string Description { get; set; }

public string ImagePath { get; set; }

[Display(Name = "Price")]
public double? UnitPrice { get; set; }

public int? CategoryID { get; set; }

public virtual Category Category { get; set; }

在上面的代码中,我不明白最后一个字段的用途是什么,

 public virtual Category Category { get; set; }

是。

然后类似的类别 .cs 文件具有以下代码 -

[ScaffoldColumn(false)]
public int CategoryID { get; set; }

[Required, StringLength(100), Display(Name = "Name")]
public string CategoryName { get; set; }

[Display(Name = "Product Description")]
public string Description { get; set; }

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

再说一遍,

的目的是什么
public virtual ICollection<Product> Products { get; set; }

最后,有一个上下文 class,代码如下 -

using System.Data.Entity;
namespace WingtipToys.Models
{
  public class ProductContext : DbContext
  {
    public ProductContext() : base("WingtipToys")
  {
}
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
  }
}

这个有一个名为 Products 的字段,但第二个 .cs 文件也有。那么,这个对象是做什么用的,它不会与另一个同样是全局的 "Products" 对象冲突吗?

这些就是所谓的导航属性。它们使您能够访问通过外键关系链接的实体。

以下是它们的使用方法。

var product = dbContext.Products.First();
var theCategoryOfTheProduct = product.Category;


var category = dbContext.Categories.First();
var allProductsInTheCategory = category.Products.ToList();

因此,在 Products 模型中,您会发现 public virtual Category Category { get; set; },它告诉您 Product 只能有一个 Category。但是在类别模型上,您会发现 public virtual ICollection<Product> Products { get; set; } -- 一个集合 -- 因为 Categories

中可能有多个 Products

您需要阅读一些关于 Entity Framework 中的关系的内容,这称为导航属性,因为您可以看到一个产品有一个类别,因此您不仅拥有 ID,还拥有一个完整的对象。

public virtual Category Category { get; set; }

作为一个类别有很多产品,导航属性它是一个集合。

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

上下文 class 它与您的数据库相关,您让 EF 知道您希望数据库中有此实体,而此 DbSet 是您访问为数据库创建的此表的方式。 base"WingtipToys" 是连接字符串的名称,如果您首先使用代码,如果数据库不存在,它将创建连接字符串和数据库。

using System.Data.Entity;
namespace WingtipToys.Models
{
  public class ProductContext : DbContext
  {
    public ProductContext() : base("WingtipToys")
  {
}
    public DbSet<Category> Categories { get; set; }
    public DbSet<Product> Products { get; set; }
  }
}