我有一些模型和数据库,但没有外键将任何东西连接在一起。这似乎是我的项目中的一个巨大弱点,所以我试图将外键插入到我的模型中,然后根据我的模型重新生成我的数据库。
我在理解外键如何工作方面遇到了一些麻烦,特别是在一对多的关系中。
对于此示例,我有一个或多个产品,每个产品可能有多个评论:
我删除了一些注释和属性来压缩模型。
产品型号/实体:
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的审核。我该怎么做才能做到这一点?
答案 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
还要确保外键不为空