如何在代码中首先定义两个实体之间的多对多和一对多关系?

时间:2018-04-06 15:29:02

标签: c# entity-framework ef-code-first relationship table-relationships

我使用实体框架代码创建一个网站 - 首先是: 用户可以销售很多产品:一对多。 用户可以购买许多产品,许多用户可以购买产品:多对多。 我一直收到错误:

  

System.Data.SqlClient.SqlException:'介绍FOREIGN KEY约束' FK_dbo.UserProducts_dbo.Products_Product_ProductId'在桌面' UserProducts'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我确实希望级联删除以删除属于删除其帐户的用户的产品,或删除UserProduct表中属于已删除用户或已删除产品的记录。 我做错了什么?

这是User类:

public class User
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime BirthDate { get; set; }
    public string Email { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }


    public ICollection<Product> Products { get; set; }
    [InverseProperty("Users")]
    public ICollection<Product> Cart { get; set; }

    public User()
    {
        Products = new List<Product>();
        Cart = new List<Product>();
    }
}

这是产品类:

public class Product
{
    [Key]
    public int ProductId { get; set; }
    public int OwnerId { get; set; }
    public string Title { get; set; }
    public string ShortDescription { get; set; }
    public string LongDescription { get; set; }

    public byte[] Picture1 { get; set; }
    public byte[] Picture2 { get; set; }
    public byte[] Picture3 { get; set; }

    [ForeignKey("OwnerId")]
    public User User { get; set; }
    public ICollection<User> Users { get; set; }

    public Product()
    {
        Users = new List<User>();
    }
}

1 个答案:

答案 0 :(得分:1)

首先,我需要在多对多关系用户到产品中为中间表编写一个类:

public class UserProduct
{
    [Key, Column(Order = 0), ForeignKey("User")]
    public int UserId { get; set; }
    [Key, Column(Order = 1), ForeignKey("Product")]
    public int ProductId { get; set; }

    public User User { get; set; }
    public Product Product { get; set; }
}

允许我禁止从此表删除级联到User表(覆盖上下文类中的OnModelCreating):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<UserProduct>().HasRequired(t => 
        t.User).WithMany(t => t.Cart).WillCascadeOnDelete(false);
    }

禁用级联有效,因为:

  1. 它解决了多个级联路径错误。
  2. 删除用户仍会删除hes产品及其UserProducts, 删除产品将删除其UserProducts。