Почему DbContext.Attach устанавливает состояние объекта в EntityState.Modified? - PullRequest
0 голосов
/ 02 ноября 2019

Почему 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"

Пример взят из здесь .

Согласно описанию метода Attach метод:

Сообщает EF, что объект уже существует в базе данных, и устанавливает состояние объекта в значение Без изменений.

Итак, в приведенном выше примере я бы ожидал, что Book будет Unchanged, но не Modified. Я что-то здесь упускаю?

ОБНОВЛЕНИЕ

После опробования кода я понял, что он вообще не будет работать. Это потому, что мы можем выполнить операцию Attach только над набором объектов. Таким образом, db.Attach(book); следует изменить на db.Books.Attach(book);. Но все же я не могу понять, что заставляет метод Attach устанавливать состояние объекта на Modified, но не Unchanged.

1 Ответ

2 голосов
/ 02 ноября 2019

Я не вижу поведения, которое вы описываете. Я добавил этот код в вашу скрипку :

using (var context = new EntityContext())
{
    var customer = new Customer() {CustomerID = 1};
    context.Customers.Attach(customer);
    var entity = context.Entry(customer);

    Console.WriteLine(entity.State);
}

И вывод:

Unchanged

Также как документация говорит, что это будетbe.

Возможно, этот комментарий (// Book Modified, Author Added - no "store generated key") является либо ошибкой, либо описанием того, что они намереваются добавить к нему автора. В этом случае вам придется установить запись на Modified перед вызовом SaveChanges или просто изменить то, что вы хотите изменить после , когда вы вызываете 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.

...