【问题标题】:Foreign Keys on Models (code-first)模型上的外键(代码优先)
【发布时间】:2012-05-07 17:30:49
【问题描述】:

我有几个模型和一个数据库,但没有将任何东西链接在一起的外键。这似乎是我项目中的一个巨大弱点,所以我试图将外键插入我的模型中,然后可能会根据我的模型重新生成我的数据库。

我在理解外键如何工作时遇到了一些麻烦,尤其是在一对多关系中。

对于这个例子,我有一个或多个产品,每个产品可能有多个评论:

我删除了一些注释和属性来压缩模型。

产品型号/实体:

public class Product
    {
        public int ProductId { get; set; }

        public int OwnerId {get; set; }

        public string Title { get; set; }

        public int Rating { get; set; }

        public decimal Price { get; set; }

        public int Quantity { get; set; }

        public string Description { get; set; }
    }

审查模型/实体:

 public class Review
    {

        public int ReviewId { get; set; }

        public int ProductId { get; set; }

        public int WriterId { get; set; }

        public string Title { get; set; }

        public string Body { get; set; }
    }

我希望 ProductId 的外键约束到审查的 ProductId。我将如何完成这项工作?

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework


    【解决方案1】:

    您至少需要一个导航属性来定义两个实体之间的关系,例如:

    public class Review
    {
        public int ReviewId { get; set; }
    
        [ForeignKey("Product")]
        public int ProductId { get; set; }
        public Product Product { get; set; }
    
        public int WriterId { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }
    

    如果需要,您还可以在Product 中添加集合属性:

    public ICollection<Review> Reviews { get; set; }
    

    您可以使用 Fluent API 定义 FK,而不是使用 [ForeignKey] 属性:

    modelBuilder.Entity<Review>()
        .HasRequired(r => r.Product)
        .WithMany()  // or .WithMany(p => p.Reviews)
        .HasForeignKey(r => r.ProductId);
    

    【讨论】:

    • 模型构建器是在 OnModelCreating 中指定的,对吗?目前我使用 modelBuilder.Entity&lt;Review&gt;().ToTable("Reviews", schemaName: "mySchema"); 我需要根据我的代码重新生成数据库,对吗?
    • @Johannes:是的,在OnModelCreating。您当前的映射仅将实体映射到表名。您可以添加更多映射代码,只需重复 modelBuilder.Entity&lt;Review&gt;().... 的内容。您不需要需要重新生成数据库,您还可以在数据库模式和模型中进行“并行”更改,以便匹配和关闭数据库初始化程序 (Database.SetInitializer&lt;MyContext&gt;(null)),如果DB 正在生产中。如果您处于开发阶段,它有助于让 EF 重新生成 DB 模式,因为它确保它与模型匹配。或者您可以使用 EF 4.3“迁移”功能。
    【解决方案2】:

    外键的目的是将表链接在一起。例如,当有唯一的 ID 号时,外键很容易解释。 productId 应该是唯一的 id,并且可能是您的产品表的主键。在审查表中,productId 是一个外键,因为它将允许连接表并查看两个表中所有类别的数据。

    从产品中选择 ProductId、Title、Price、WriterId、Description 为 P,Review 为 R 其中 P.ProductId = R.ProductId;

    当这个 select 语句对你的数据库运行时,你会从评论表中看到产品唯一 ID、标题、价格、作者 ID、描述。关键行是 P.ProductId = R.ProductId

    还要确保外键不为空

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2018-05-31
      相关资源
      最近更新 更多