Entity Framework 4.0 Обновление отношений POCO - PullRequest
1 голос
/ 06 декабря 2010

Я создал класс POCO и его эквивалент в файле edmx (сущность Category с односторонним свойством навигации Parent)

public class Category {
    public int ID {get;set;}
    public string Name {get;set;}
    public Category Parent {get;set;}
} 

И у меня проблема с операциями CRUD, влияющими на свойство Parent:

Получить выглядит как:

public void CanRetrieve() {
var category = context.Categories.Where(x => x.ID == id).FirstOrDefault();
cotext.LoadProperty<Category> (category, c => c.Parent);

}

Муравей работает нормально (я получаю объект Category с заполненным родительским свойством)

Добавить выглядит так:

public void CanAdd() {
    Category cat = new Category();
    cat.Name = "cat 1";    
    cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12 
    context.Categories.Attach(cat);
    context.SaveChanges();
}

также работает нормально (в БД появляется новая запись с полем Parent_ID, установленным в 12)

И обновление:

public void CanUpdate() {
    Category cat = new Category();
    cat.Name = "cat 1";    
    cat.Parent = new Category() {ID = 12}; //assuming that in the database there is a record with ID 12 
    context.Categories.Attach(cat);
    //XXX    
    context.SaveChanges()
}

делает что угодно. Если я заменим строку // XXX следующей строкой:

Context.ObjectStateManager.ChangeObjectState(cat, EntityState.Modified); 

значение свойства Name обновляется из исходного объекта (я думаю, другие скалярные свойства также будут), но Parent игнорируется и поле Parent_ID в базе сохраняется.

У меня вопрос: как в этом сценарии я могу сказать контексту, что я хочу, чтобы значение свойства Parent также отражалось в базе данных, и можно ли это сделать, не передавая все значения свойства Parent (только идентификатор, как в сценарии добавления) )

С уважением,

Andrzej

Ответы [ 2 ]

0 голосов
/ 05 июня 2012

К сожалению, мне пришлось добавить свойство ParentId (или как там называется столбец), чтобы оно работало. Я знаю, что это отстой, но я не понял этого иначе.

Итак, измените свойство и обнулите родительское свойство, присоедините экземпляр к контексту, отметьте его как измененный и вызовите SaveChanges(); и это все.

ИМО, это должно быть решено EF. Я использую EntityTypeConfiguration для каждого Class <-> Table Mapping, чтобы сохранить базу данных и классы неизменными, поэтому будет просто знать, что EF должен использовать то, что я отметил как первичный ключ.

0 голосов
/ 06 декабря 2010

Вы действительно уверены, что ваш код CanAdd действительно работает?Вы присоединяете два новых объекта к контексту, что означает, что они находятся в неизменном состоянии.При вызове SaveChanges они не должны быть вставлены.Если вы используете AddObject вместо Attach, обе новые и родительские категории будут установлены в состояние добавлено, и обе будут вставлены в SaveChanges.

Ваш метод CanUpdate не работает, потому что вы просто устанавливаете обновленную категорию в измененное состояние, ноВы прикрепили три объекта - категорию, родительскую категорию и отношения между ними.Вы также должны изменить состояние отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...