0

假设我有两个模型:

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();

突然,我在 table 中找到了一个用户 (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. 我将 MSQL2008 Express 与 win auth 一起使用,所以我创建了用户表

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

我再次在 Friends 表中获得了 1 条记录,其中列 FriendId=1、A_UserId=1、B_UserId=2。我检查了用户表,我仍然有 2 条记录。

如果我是你,我会在一个单独的应用程序中尝试我的代码。如果可行,请在此处发布导致您遇到此问题的所有步骤。

于 2013-11-14T01:04:46.273 回答