2016-10-16 9 views
6

私は、このモデルクラスを持っている:Entity Frameworkのの奇妙な行動

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のコレクション2 user1の

Collection2で私がレコードを持っているのはなぜ?それを修正する方法は?

UPDATE。

enter image description here

これは、それは不思議ではないですが、正常な動作テストプロジェクトhttps://drive.google.com/file/d/0BxP-1gZwSGL5S1c4cWN1Q2NsYVU/view

+1

質問が明確ではありません。なぜレコードがあるのか​​、なぜレコードが 'user1'なのかを意味していますか? – peval27

+0

実際に面白い動作。 EFのように、多対多の関係が設定されているようです。生成されたテーブルを確認することで確認できます。 –

+0

@ peval27、私の英語には申し訳ありません。なぜコレクション2にレコードがあるのですか? 私はそれを追加しませんでした。 – Lightness

答えて

4

へのリンクです。

は、以下のモデルを検討してください。

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; } 
} 

これは暗黙ジャンクションテーブルを有する典型的なEF many-to-many関係です。 entity1entity2.Collection1に追加すると、entity2からentity1.Collection2にも加算されます。

Entity1 = Entity2 = Userを代用してください。結果はまさにあなたのモデルです。

まもなく、そのモデルEFは暗黙のUsersUsersジャンクションテーブルを介して自己many-to-manyという関係を作成します。そのため、説明した動作が得られます。

あなたの意図は、2体のone-to-many関係を持っているようですので、あなたが流暢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(); 
    } 
} 

今、すべてが動作します。

+0

優れた説明+1 :) – Sampath