私はこのモデルクラスを持っています:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Collection1 { get; set; } = new List<User>();
public virtual ICollection<User> Collection2 { get; set; } = new List<User>();
}
次に、データベースにいくつかのレコードを追加します。
var context = new UsersContext();
var user1 = new User();
var user2 = new User();
var user3 = new User();
user1.Name = "user1";
user2.Name = "user2";
user3.Name = "user3";
user1.Collection1.Add(user2);
user2.Collection1.Add(user3);
context.Users.Add(user1);
context.Users.Add(user2);
context.Users.Add(user3);
context.SaveChanges();
次に、このクエリを実行します。
var user2 = context.Users.First(user => user.Name == "user2");
foreach (var u in user2.Collection2)
Console.WriteLine($"{user2.Name} Collection2 {u.Name}");
そして私は得る:
user2コレクション2user1
なぜCollection2
私は記録を持っているのですか?そしてそれを修正する方法は?
更新。
これはテストプロジェクトへのリンクですhttps://drive.google.com/file/d/0BxP-1gZwSGL5S1c4cWN1Q2NsYVU/view
奇妙なことではありませんが、予想される動作です。
次のモデルを検討してください。
public class Entity1
{
public int Id { get; set; }
public ICollection<Entity2> Collection2 { get; set; }
}
public class Entity2
{
public int Id { get; set; }
public ICollection<Entity1> Collection1 { get; set; }
}
これは、many-to-many
暗黙のジャンクションテーブルとの典型的なEF関係です。に追加するentity1
とentity2.Collection1
、にも追加さentity2
れentity1.Collection2
ます。
代わりにEntity1 = Entity2 = User
。結果はまさにあなたのモデルです。
すぐに、そのモデルでEFはmany-to-many
暗黙のUsersUsers
ジャンクションテーブルを介して自己関係を作成します。そのため、説明されている動作が得られます。
あなたの意図は2つのone-to-many
関係を持っているように思われるので、Fluent APIを使用して、それをEFに明示的に伝える必要があります。
public class UsersContext : DbContext
{
public DbSet<User> Users { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(e => e.Collection1).WithOptional();
modelBuilder.Entity<User>().HasMany(e => e.Collection2).WithOptional();
}
}
これで、すべてが期待どおりに機能します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加