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。如果这确实是作者的意图,那么
作者
应该在调用
附加
后进行修改。我更新了我的答案来解释这一点。