假设我有两个模型:
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 个用户(ids: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,山姆)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 是相同的)?
老实说,尝试了与您描述的相同的步骤,一切正常。反正我的脚步
-
创建了一个派生自"DbContext"的数据库上下文类
public class EFContext : DbContext { public DbSet<Friend> Friends { get; set; } public DbSet<User> Users { get; set; } public EFContext(string connectionString) : base(connectionString) { } }
-
我将MSQL2008 Express与win身份验证一起使用,因此我创建了"用户"表
using (var db = new EFContext(@"Data Source=yourMachineNameSQLEXPRESS2008;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(); }
-
我检查了我的数据库,发现了 2 条记录
-
创建好友表后
using(var db = new EFContext(@"Data Source=yourMachineNameSQLEXPRESS2008;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(); }
我再次在朋友表中得到了 1 条记录,列 FriendId=1、A_UserId=1、B_UserId=2。我检查了用户表,我仍然有 2 条记录。
如果我是你,我会在单独的应用程序中尝试我的代码。如果它有效,请在此处发布导致您解决此问题的所有步骤。