假设我有两种模式:
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();
突然间,我在表user
中找到了一个用户(3,Sam)。这背后的原因是什么?不完全确定是否相关,但请注意,即使我将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是相同的)?
答案 0 :(得分:1)
老实说尝试了你描述的相同步骤,一切运作良好..无论如何我的步骤
创建了一个派生自`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 auth,所以我创建了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();
}
我检查了我的数据库并找到了2条记录
创建好友表后
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。 我检查了Users表,但仍然有2条记录。
如果我是你,我会在一个单独的应用程序中尝试我的代码。如果它有效,那么请在此处发布导致您遇到此问题的所有步骤。