【问题标题】:EF Code First - Multiplicity constraint violated. The role '...' of the relationship '...' has multiplicity 1 or 0...1EF Code First - 违反多重性约束。关系 '...' 的角色 '...' 具有多重性 1 或 0...1
【发布时间】:2018-02-05 14:33:50
【问题描述】:

我正在尝试使用 EF Code First 开发一个包含“在线朋友”功能的项目。我必须将所有用户的朋友存储在数据库中。我有用于用户的“用户”POCO 类和用于保存用户朋友的“FriendRelationship”POCO 类。这些 POCO 类是:

[Table("UserTable")]
public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    //other properties

    public int? FriendListID {get; set;}

    public virtual FriendRelationship FriendList { get; set; }
}

[Table("FriendRelationshipTable")]
public class FriendRelationship
{
    public FriendRelationship()
    {
        Friends = new List<User>();
    }

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public virtual List<User> Friends { get; set; }
}

我的 Fluent API 是:

modelBuilder.Entity<User>()
            .HasOptional(o => o.FriendList)
            .WithMany(m => m.Friends)
            .HasForeignKey(fk => fk.FriendListID)
            .WillCascadeOnDelete(false);

我在用户对象的第一次创建时在用户对象中创建朋友对象(这个用户对象添加到控制器的数据库中。):

public class CreateAccountModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpRequestBase request = controllerContext.HttpContext.Request;
        //other actions

        User _user = new User();
        _user.FriendList = new FriendRelationship();

       //other actions and return
    }
}

最后,我的朋友加法尝试:

static void AddFriendByManually()
    {
        using (var context = _liveCampusContext)
        {
            User Admin2 = context.Users.SingleOrDefault(w => w.Username == "Admin2");
            User Admin = context.Users.SingleOrDefault(w => w.Username == "Admin");
            User AdminVader= context.Users.SingleOrDefault(w => w.Username == "AdminVader");

            Admin.FriendList.Friends.Add(Admin2);
            Admin.FriendList.Friends.Add(AdminVader);

            Admin2.FriendList.Friends.Add(Admin);
            Admin2.FriendList.Friends.Add(AdminVader);

            AdminVader.FriendList.Friends.Add(Admin2);
            AdminVader.FriendList.Friends.Add(Admin);

            context.SaveChanges();
        }
    }

执行 context.SaveChanges() 行时,抛出异常:

违反了多重性约束。关系“TeachLearnWeb.Data.DbContextFolder.User_FriendList”的角色“User_FriendList_Target”具有多重性 1 或 0..1。

我错过了什么?谢谢。

【问题讨论】:

    标签: asp.net-mvc entity-framework


    【解决方案1】:

    从你展示的使用示例来看,这种关系实际上应该是多对多的:

    • 任何用户都可以有很多朋友。
    • 同一个朋友可以显示给许多用户。

    此外,朋友关系是双向的(我强烈怀疑)。

    所以在Admin.FriendList.Friends.Add(AdminVader); 之后,AdminVader 的 FriendList 将已经包含 Admin,我们可以跳过 AdminVader.FriendList.Friends.Add(Admin); 行。

    如果您想存储有关关系本身的其他数据(例如 FriendSince 时间戳),则只需要 FriendRelationship 类。 否则将您的模型更改为

    public class User
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
    
        //other properties
    
        public virtual ICollection<User> Friends { get; set; }
    }
    

    并将关系的配置更改如下:

     ModelBuilder.Entity<User>()
         .HasMany(u => u.Friends)
         .WithMany()
         .Map(m => m.ToTable("FriendRelationshipTable"));
    

    【讨论】:

      【解决方案2】:

      根据您的代码中给出的示例:

      Admin.FriendList.Friends.Add(Admin2);
      Admin.FriendList.Friends.Add(AdminVader);
      

      *在上面的代码中你添加了 Admin2 和 AdminVader。

      Admin2.FriendList.Friends.Add(Admin);
      Admin2.FriendList.Friends.Add(AdminVader);
      

      * 在上面的 2 行中,您添加了 Admin 和 AdminVader。所以 AdminVader 被添加了两次,这导致了多重性约束。

      您可能需要对表格进行更改。 在 UserTable 中,可以存储所有用户。

      [Table("UserTable")]
      public class User
      {
          [Key]
          [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
          public int ID { get; set; }
          public string Name {get; set;}
      }
      

      在 FriendRelationshipTable 中,存储 userID(将拥有一组朋友的用户)和 FriendsUserId(这将存储用户拥有的朋友的 id) [表(“朋友关系表”)] 公共类FriendRelationship {

          [Key]
          [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
          public ID
          public int FriendUserID { get; set; }
          public int UserID {get; set;}
      
      }
      

      我没有添加其他属性。 检查此表配置是否有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多