私はCodeFirstを初めて使用し、2人のユーザーが友達コレクションにお互いを持つことができるように友達コレクションを作成しようとしています。
これが私のユーザークラスです:
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);
}
}
}
SaveChangesは、FriendクラスにUserオブジェクトを入力しようとすると、次のようなエラーをスローします。
多重度制約に違反しました。リレーションシップ「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を呼び出し元の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に別のユーザーを割り当てる方法を教えてもらえますか?