EF 4.0 Self-Tracking Entities, предполагаемые обновления переводятся во вставки - PullRequest
0 голосов
/ 11 апреля 2011

Предположим, что приведенный ниже метод живет в службе WCF.Пользовательский интерфейс извлекает экземпляр объекта Status и выполняет последующий вызов службы с использованием этого метода.Вместо того, чтобы назначать статус пользователю, как я ожидал, он пытается вставить статус.Что я делаю не так?

void Method(Status status)
{
    //not sure if this is even needed, the status never changed
    context.Statuses.ApplyChanges(status);

    //get the first user from the database
    User user = context.Users.Where(u => u.Id = 1).First();

    //set user status to some existing status
    user.Status = status;

    //this throws an exception due to EF trying to insert a new entry
    //into the status table, rather than updating the user.StatusId column.
    context.SaveChanges();
}

Ответы [ 3 ]

1 голос
/ 12 апреля 2011

Проблема в том, что вы работаете с прикрепленным пользователем. Когда STE привязан к контексту, он ведет себя точно так же, как и любой другой объект. Более того, сам механизм отслеживания не активирован. Поэтому вы должны прикрепить статус к контексту, прежде чем устанавливать его для пользователя, иначе он будет отслеживаться как новый объект, который необходимо вставить:

void Method(Status status)
{
    User user = context.Users.Where(u => u.Id = 1).First();

    context.Attach(status);
    user.Status = status;

    context.SaveChanges();
}
1 голос
/ 11 апреля 2011

Попробуйте вместо этого:

        using (Entities ctx = new Entities())
        {
            ctx.Statuses.Attach(status);

            ObjectStateEntry entry = ctx.ObjectStateManager.GetObjectStateEntry(status);
            entry.ChangeState(EntityState.Modified);

            //get the first user from the database
            User user = ctx.Users.Where(u => u.Id = 1);

            //set user status to some existing status
            user.StatusID = status.StatusID;

            ctx.SaveChanges();
        }

Вот учебник по CRUD с Entity Framework , если вам интересно.

0 голосов
/ 03 мая 2011

Нужно написать ответ, потому что я пока не могу комментировать другой ответ (количество повторений <50) [<em> что-то странно не правильно в этом, но я понимаю, почему это так ], потому что я хотелдобавить некоторую ясность в ответ @ Ladislav.

Объект Status, поступающий из вызова WCF, пришел не из того же context, который вы используете для поиска объекта User, поэтому код отслеживанияне с этим контекстом.Вот почему его присоединение позволит вам сохранить назначение без context, думая, что status - это новый объект, требующий вставки в базу данных.

...