我是 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 分配不同的用户?