Само отслеживания Poco - PullRequest
       6

Само отслеживания Poco

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

У меня есть такой класс poco

public Profile
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual string Description
    {
        get;
        set;
    }

    public virtual bool Enabled
    {
        get;
        set;
    }
}

Когда я пытаюсь обновить таким образом

var prof = new Profile(){ ID = 1, Enabled = false };
context.Profiles.Single (s => s.ID == 1);
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();

Sql говорит мне, что Description не допускает NULL, но яне обновляя столбец «Описание», я хочу обновить только поле «Включено».

Что не так?

Tks

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

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

var prof = new Profile { ID = 1, Enabled = false };
// Attach prof as unchanged entity
context.Profiles.Attach(prof);
// Get state entry for prof
ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(prof);
// Set only Enabled property to changed
entry.SetModifiedProperty("Enabled");
context.SaveChanges();

Как видите, мне не нужно было сначала загружать объект из базы данных.Мне удалось установить, какое свойство было изменено на отдельном объекте.

0 голосов
/ 21 апреля 2011

Разве это не работает?

var prof = context.Profiles.Single(s => s.ID == 1);
prof.Enabled = false;
context.SaveChanges(); 

Я думаю, что проблема в том, что вы вызываете ApplyCurrentValues ​​из неотслеживаемого объекта - это означает, что он не знает, какие свойства были и не были изменены, поэтому он просто копирует все свойства В том числе те, которые являются нулевыми - в вашем случае Описание.

Вам не нужно вызывать ApplyCurrentValues, если вы изменяете значения сущности, которая загружается из контекста данных.

0 голосов
/ 21 апреля 2011

Исходя из моего комментария: не зная EF4, вот как я ожидал бы, что он будет работать:

var prof = context.Profiles.Single (s => s.ID == 1);
prof.Enabled = false;
context.Profiles.ApplyCurrentValues(prof);
context.SaveChanges();

Если предположить, что Single - это Linq Single, то он вернет значение, которое вы должны изменить.

...