0

2 つのモデルがあるとします。

public class User
{
    [Key]
    public int UserId { get; set; }
    public string Name { get; set; }
}

public class Friend
{
    [Key]
    public int FriendId { get; set; }
    public User A { get; set; }
    public User B { get; set; }
}

データベースに 2 人のユーザーしかいないとします (ID: 1 (Jon) と 2 (Sam))。今、私はこのようにテーブルに挿入しますfriend:

db.Friends.Add(new Friend()
{
    A = db.Users.Find(1),
    B = db.Users.Where(u => u.UserId == 2).First()
});

db.SaveChanges();

突然、テーブルでユーザー (3、Sam) を見つけましたuser。この背後にある理由は何ですか?関連するかどうかは完全にはわかりませんが、A フィールドと B フィールドを仮想化しても何も変わらないことに注意してください。

アップデート

最後に、私の問題を再現する方法を見つけました。どうやら、問題は私が説明したものとまったく同じではないようです。

User a, b;

using (var db = new DbConnection())
{
    a = db.Users.First(u => u.UserId == 1);
    b = db.Users.First(u => u.UserId == 2);
}

using (var db = new DbConnection())
{
    db.Friends.Add(new Friend()
    {
        A = a,
        B = b
    });

    db.SaveChanges();
}

usersこれでユーザーは 4 人になりました。トランザクションを終了すると、エンティティが現在のトランザクションとまったく同じアイテムであるかのようにアクセスできなくなるということですか? または、同じアイテムを参照していることをプログラムに知らせる方法がありますか (ID が同じであるため)。

4

1 に答える 1

1

あなたが説明したのと同じ手順を正直に試してみましたが、すべてうまくいきました.とにかく私の手順

  1. 「DbContext」から派生したデータベース コンテキスト クラスを作成しました

    public class EFContext : DbContext
    {
        public DbSet<Friend> Friends { get; set; }
        public DbSet<User> Users { get; set; }
    
        public EFContext(string connectionString)
            : base(connectionString)
        {
    
        }
    
    }
    
  2. win authでMSQL2008 Expressを使用しているため、Usersテーブルを作成しました

    using (var db = new EFContext(@"Data Source=yourMachineName\SQLEXPRESS2008;Initial Catalog=DBName;Integrated Security=True;MultipleActiveResultSets=True"))
    {
        db.Users.Add(new User()
        {
            UserId = 1,
            Name = "John"
        });
    
        db.Users.Add(new User()
        {
            UserId = 2,
            Name = "Sam"
        });
    
        db.SaveChanges();
    }
    
  3. データベースをチェックしたところ、2 つのレコードが見つかりました

  4. Friends テーブルを作成した後

    using(var db = new EFContext(@"Data Source=yourMachineName\SQLEXPRESS2008;Initial Catalog=DBName;Integrated Security=True;MultipleActiveResultSets=True"))
    {
        db.Friends.Add(new Friend()
        {
            A = db.Users.Find(1),
            B = db.Users.Where(u => u.UserId == 2).First()
        });
    
        db.SaveChanges();
    }
    

ここでも、FriendId=1、A_UserId=1、B_UserId=2 という列を持つ Friends テーブルに 1 つのレコードを取得しました。Users テーブルを確認したところ、まだ 2 つのレコードが残っています。

私があなただったら、別のアプリで自分のコードを試します。動作する場合は、この問題を引き起こしたすべての手順をここに投稿してください。

于 2013-11-14T01:04:46.273 に答える