2014-01-21 5 views
0

У меня есть два класса:EF не обновляет свойство навигации в базе данных

public class Foo 
{ 
    public Guid Id { get; set; } 
    public string Subject { get; set; } 
    public TenderType TenderType { get; set; } 
} 

и

public class TenderType 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

При редактировании Foo класса, когда я изменить TenderType собственности и использовать этот код:

_db.Entry(tender).State = EntityState.Modified; 
_db.SaveChanges(); 

все, кажется, работает, и мой контекст будет обновляться новыми значениями, но только свойства, подобные Subject, были изменены в базе данных! И TenderType по-прежнему не изменился в базе данных (не в контексте)!

Даже после вызова db.SaveChange(), если я выполнил запрос Linq Fetch на Foo, контекст возвратил запись с новыми значениями! Но в базе данных TenderType все еще имеет старые значения.

Что такое поведение платформы Entity Framework и почему?

Как это исправить?

(я использую EF 5).

+0

Можете ли вы показать, как вы ** изменяете/редактируете ** экземпляр вашего класса 'Foo'? –

ответ

0

наконец я нашел мой ответьте сами. после _db.SaveChanges(); i do a _db=new Context(); и повторное назначение значений, затем _db.SaveChanges(); сделал работа. но я не получил записку!

0

Я верю, что вам нужно сообщить EF Include<>() вашим основным объектам. Причина: Тема: Работы - это не собственный класс. Я не пробовал это или что-то еще, но я думаю, что это то, что вам нужно делать. Если это не работает, дайте мне знать, и я удалю этот неправильный ответ

var fooEntity = _db.Set<Foo>().Include(o => o.TenderType); 
fooEntity.State = EntityState.Modified; 
_db.SaveChanges(); 

Поскольку я часто обладают многими свойствами (которые являются пользовательские классы) Я часто создают методы расширения для моей БД сущности, чтобы помочь мне с этим и почему бы не бросить в качестве делегата для фильтрации данных непосредственно с помощью лямбда-выражения ..

public static IQueryable<Foo> AllFoo(this MyDBContext context, Expression<Func<Foo, bool>> predicate = null) 
{ 
    if (predicate == null) 
     predicate = o => o != null; 

    return context.Foo 
     .Where(predicate) 
     .Include(o => o.TenderType); 
} 

теперь ...

var fooEntity = _db.AllFoo(o => o.TenderType == TenderTypes.Type1).FirstOrDefault(); 
fooEntity.TenderType = TenderTypes.Type2; 
_db.SaveChanges(); 
Смежные вопросы