C# 为什么DbContext.Attach会将实体状态设置为EntityState.Modified?
为什么在下面的示例中,C# 为什么DbContext.Attach会将实体状态设置为EntityState.Modified?,c#,entity-framework,change-tracking,C#,Entity Framework,Change Tracking,为什么在下面的示例中,DbContext.Attach将实体状态设置为EntityState.Modified var db = new TestContext(); var book = new Book { BookId = 1, Author = new Author { FirstName = "Charles", LastName = "Dickens" } }; db.Attach(book); // Book Mod
DbContext.Attach
将实体状态设置为EntityState.Modified
var db = new TestContext();
var book = new Book {
BookId = 1,
Author = new Author {
FirstName = "Charles",
LastName = "Dickens"
}
};
db.Attach(book); // Book Modified, Author Added - no "store generated key"
这一例子取自
根据附件
方法说明,方法如下:
告诉EF数据库中已存在该实体,并将该实体的状态设置为未更改
因此,在上面的示例中,我希望书籍
保持不变
,而不是修改
。我是不是遗漏了什么
更新
在试用了这个代码之后,我发现它根本不起作用。这是因为我们只能对一组对象执行
Attach
操作。因此,db.Attach(book)代码>应更改为db.Books.Attach(book)代码>。但是我仍然无法理解是什么使得Attach
方法将实体的状态设置为Modified
,而不是Unchanged
我没有看到您描述的行为。我将此代码添加到:
输出为:
Unchanged
就像我说的那样
可能该注释(//Book Modified,Author Added-no“store generated key”
)是一个错误,或者说明他们打算将作者添加到该注释中。在这种情况下,您必须在调用SaveChanges
之前将记录设置为Modified
,或者在调用Attach
之后只修改您想要修改的内容,如下所示:
using (var context = new EntityContext())
{
var customer = new Customer() {CustomerID = 1};
context.Customers.Attach(customer);
//change something
customer.Description = "something";
var entity = context.Entry(customer);
Console.WriteLine(entity.State);
}
这将显示已修改
我没有看到您描述的行为。我将此代码添加到:
输出为:
Unchanged
就像我说的那样
可能该注释(//Book Modified,Author Added-no“store generated key”
)是一个错误,或者说明他们打算将作者添加到该注释中。在这种情况下,您必须在调用SaveChanges
之前将记录设置为Modified
,或者在调用Attach
之后只修改您想要修改的内容,如下所示:
using (var context = new EntityContext())
{
var customer = new Customer() {CustomerID = 1};
context.Customers.Attach(customer);
//change something
customer.Description = "something";
var entity = context.Entry(customer);
Console.WriteLine(entity.State);
}
这将显示Modified
您是在.NET还是.NET Core中进行测试?您是如何测试它是否被修改的?@GabrielLuci,我刚刚试过了。为了测试状态,我使用了Console.WriteLine(db.Set.Entry(Entity.state)
@GabrielLuci,实际上我只是好奇在执行Attach
方法之后是否有可能修改实体状态。你是说它是修改的
。我问你是怎么知道的。你是用.NET还是.NET内核进行测试的?你是如何测试它是否被修改的?@GabrielLuci,我刚刚试过了。为了测试状态,我使用了Console.WriteLine(db.Set.Entry(Entity.state)
@GabrielLuci,实际上我只是好奇在执行Attach
方法之后是否有可能修改实体状态。你是说它是修改的
。我是问你怎么知道的。你是对的,但在示例中,他们将作者实体添加到图书中,这样它就可以将主要图书实体更改为修改的IMO。如果这确实是作者的意图,那么作者
应该在调用附加
后进行修改。我更新了我的答案来解释这一点。你是对的,但在示例中,他们将作者实体添加到图书中,这样就可以将主要图书实体更改为修改的IMO。如果这确实是作者的意图,那么作者
应该在调用附加
后进行修改。我更新了我的答案来解释这一点。