Сначала используйте код Enitify Framework: обновление сущности с помощью требуемого связанного навигационного свойства - PullRequest
1 голос
/ 11 августа 2011

Моя модель выглядит следующим образом

public Class Address 
{
     public int Id {get;set;}

     /*Props here*/
}

public Class Person
{
     public int Id {get;set;}

     public String Name {get;set;}

     [Required]      
     public Address Address{get;set;}

     /*More props*/
}

Теперь предположим, что я создал человека с правильным адресом, в будущем, когда я попытаюсь обновить такого человека, как этот

var person= db.Persons.FirstOrDefault(p=>p.Id=1234);
person.Name="Foo";
db.SaveChanges();

Выдает ошибку, говоря, что Адрес требуется.

Поэтому, чтобы избежать этого iam, включая свойство Address при загрузке Person Entity

var person= db.Persons.Include(p=>p.Address).FirstOrDefault(p=>p.Id=1234);
person.Name="Foo";
db.SaveChanges();

Есть ли способ обновить person Безв том числе Address.

Ответы [ 2 ]

3 голосов
/ 11 августа 2011

Это модель проверки DbContext, которая, по-видимому, жалуется.Таким образом, одним из решений было бы отключить эту проверку:

dbContext.Configuration.ValidateOnSaveEnabled = false;

Другой вариант - ввести свойство внешнего ключа:

public class Person
{
    public int Id {get;set;}
    public String Name {get;set;}
    public int AddressId {get;set;}
    public Address Address {get;set;}

    /*More props*/
}

Вы можете опустить атрибут [Required] здесьпотому что EF обнаружит отношения, как того требует соглашение (из-за ненулевого свойства FK).Это также работает с включенной проверкой.

Поведение немного сбивает с толку, так как EF не отправляет изменение столбца FK в базу данных, поэтому на самом деле нарушения ограничений нет, и команда Update выполняется нормально.Я предполагаю, что валидация просто проверяет состояние модели в памяти (недопустимо, потому что Address имеет значение null), а не состояние, которое будет иметь модель в базе данных при выполнении SaveChanges (допустимо, потому что FK установлен правильно).

0 голосов
/ 11 августа 2011

Если вы хотите, чтобы адрес автоматически загружался EF 4.1, вы должны сделать виртуальный адрес-адрес:

public virtual Address Address{get;set;}

EF тогда будет лениво загружать адрес при необходимости.

...