模型上的外键(代码优先)

时间:2012-05-07 17:30:49

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

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

我在理解外键如何工作方面遇到了一些麻烦,特别是在一对多的关系中。

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

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

产品型号/实体:

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的审核。我该怎么做才能做到这一点?

2 个答案:

答案 0 :(得分:4)

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

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);

答案 1 :(得分:0)

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

选择ProductId,Title,Price,WriterId,产品描述为P,回顾为R. 其中P.ProductId = R.ProductId;

当针对ur db运行此select语句时,您将看到来自review表的产品唯一ID,标题,价格,作者ID,desript。关键是P.ProductId = R.ProductId

还要确保外键不为空