2012-01-09 2 views
2

Я пытаюсь просто загрузить объект, изменить свойство и затем сохранить его обратно в базу данных.Изменение свойства объекта в Entity Framework вызывает ошибку проверки

var db = new NewsletterContext(); 
var newsletter = db.Newsletters.Find(x => x.ID==newsletterID); 
newsletter.SomeProperty = 5; 
db.SaveChanges(); 

Это вызывает ошибку проверки, поскольку есть некоторые свойства объекта информационного бюллетеня, которые необходимы, и, по-видимому, не загруженные, когда я делаю Find().

я могу решить эту проблему с помощью Include() для каждого требуемого имущества с последующим Where():

var db = new NewsletterContext(); 
var newsletter = db.Newsletters.Include(x => x.RequiredProp1) 
        .Include(x => x.RequiredProp2).Include(x => x.RequiredProp3) 
        .Where(x => x.ID==newsletterID) 
        .FirstOrDefault(); 
db.SaveChanges(); 

Это не очень элегантное решение и сломается, если добавить еще необходимые свойства для Newsletter объекта.

Есть ли лучшее решение?

+0

Да, извините, только терминология. RequiredProp1 и т. Д. Являются фактически связанными объектами. Сам объект информационного бюллетеня загружается отлично, и я могу прочитать все свойства, но сохранение обратно вызывает ошибку. – Judo

+0

Код EF 4.1 сначала с .NET 4.0 в приложении MVC 3. – Judo

ответ

6

Структура Entity будет отключать ленивую загрузку при выполнении проверки. Следовательно, если вы поместите требуемую проверку на навигационные свойства, проверка не завершится. Вместо этого вы можете украсить скалярное свойство, относящееся к навигационному свойству.

public class Foo 
{ 

    [Required] 
    public int? RequiredScalarId { get; set; } 

    public virtual Bar RequiredNavigationalProp { get; set; } 
} 
+0

Не добавляет ли это еще одно (возможно, необязательное) поле в базу данных? Есть ли способ программно включить lazyloading для проверки? – Judo

+0

@Judo Lazy Загрузка по проверке отключена по той же причине. Избегайте ненужной ленивой загрузки. Наличие скалярного свойства удобно, как в этом случае. Он не добавляет поля в базу данных. – Eranga

1

Не хотите загрязнять вашу модель с помощью ключей foriegn? Хорошо! Читай дальше. Вместо этого вы можете переопределить метод SaveChanges в NewsletterContext. Получить все измененные объекты и с помощью отражения, загрузить все свои ленивые загруженные свойства и коллекцию, используя следующий синтаксис выборки:

db.Entry(newsletter).Reference(n => n.RequiredProp1).Load(); 
db.Entry(newsletter).Collection(n => n.RequiredCollec1).Load(); 

Это не будет легко, как это звучит, но как только вы написали, он бы чувствую себя так хорошо, что он работает без проблем :)

Смежные вопросы