我是 CodeFirst 的新手,我正在尝试创建一个 Friends Collection,以便两个用户可以在他们的 Friends Collection 中拥有彼此。
这是我的用户类:
public class User
{
    public User()
    {
        if (FriendCollection == null) FriendCollection = new Collection<Friend>();
    }
    public long ID { get; set; }
    public virtual ICollection<Friend> FriendCollection { get; set; }
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        HasKey(x => x.ID);
    }
}
这是我的朋友班:
public class Friend
{
    public Friend()
    {
        DateAdded = DateTime.UtcNow;
    }
    public long ID { get; set; }
    public DateTime DateAdded { get; set; }
    public long UserID { get; set; }
    public virtual User User { get; set; }
}
public class FriendConfiguration : EntityTypeConfiguration<Friend>
{
    public FriendConfiguration()
    {
        HasKey(x => x.ID);
        HasRequired(x => x.User).WithMany(x => x.FriendCollection).HasForeignKey(x => x.UserID);
    }
}
这是我的实体类:
    public Entities()
    {
        Database.SetInitializer<Entities>(new DropCreateDatabaseAlways<Entities>());
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Friend> Friends { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
        modelBuilder.Configurations.Add(new FriendConfiguration());
        base.OnModelCreating(modelBuilder);
    }
}
这是我的控制台代码,理想情况下是我想要实现的:
        using (Entities db = new Entities ())
        {
            var u1 = new User();
            db.Users.Add(u1);
            var u2 = new User();
            db.Users.Add(u2);
            u1.FriendCollection.Add(new Friend { User = u2 });
            u2.FriendCollection.Add(new Friend { User = u1 });
            try
            {
                var cnt = db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                    }
                }
            }
每当我尝试使用 User 对象填充 Friend 类时,SaveChanges 都会引发错误:
违反了多重性约束。关系“Entities.Friend_User”的角色“Friend_User_Target”具有多重性 1 或 0..1。
如果我像这样分配给 UserID:
u1.FriendCollection.Add(new Friend { UserID = u2.ID });
这允许我保存实体,但不正确!
当我单步执行代码时,我可以隔离问题,这就是我发现的:
b.FriendCollection.Add(new Friend { UserID = a.ID });
//Friend.UserID = 1
db.SaveChanges();
//Friend.UserID = 2 matching the b.ID
因此,如果我将 Friend.User 分配给调用用户,现在我可以回到我之前的示例和 SaveChanges() 而不会引发错误。例如:
b.FriendCollection.Add(new Friend { User = b }); 
db.SaveChanges()
但是当我尝试分配不同的用户时,我得到了错误。例如:
b.FriendCollection.Add(new Friend { User = a }); 
db.SaveChanges()
我得到:
违反了多重性约束。关系“Entities.Friend_User”的角色“Friend_User_Target”具有多重性 1 或 0..1。
谁能告诉我如何修复我的模型(使用 FluentAPI),以便我可以为我的 User.FriendCollection 分配不同的用户?