首页 文章

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

提问于
浏览
0

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

System.Data.SqlClient.SqlException:'在表'UserProducts'上引入FOREIGN KEY约束'FK_dbo.UserProducts_dbo.Products_Product_ProductId'可能会导致循环或多个级联路径 . 指定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>();
    }
}

这是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 回答

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

    禁用级联工作原因是:

    • 它解决了多个级联路径错误 .

    • 删除用户仍会删除hes产品及其UserProducts,删除产品将删除其UserProducts .

相关问题