EntityFrameworkの奇妙な動作

軽さ

私はこのモデルクラスを持っています:

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

Ivan Stoev

奇妙なことではありませんが、予想される動作です。

次のモデルを検討してください。

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関係です。に追加するentity1entity2.Collection1、にも追加さentity2entity1.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]

編集
0

コメントを追加

0

関連記事