Свойство навигации не сохраняется при использовании независимого ассоциативного подхода в EF 4.1

#entity-framework-4.1

#entity-framework-4.1

Вопрос:

Ниже приведена процедура сохранения существующей записи. Что в этом плохого? Я использую независимую ассоциацию

Ошибка не выдается, однако поле Country_CountryId в таблице Person не изменилось, все остальное правильно сохранено. Что не так в следующем коде / подходе?

 public JsonResult SaveUpdate(Person p)
{
    p.Country = new Country { CountryId = new Guid("EF0CD98E-7138-4757-866E-ADC3C8D216DA") };

    using (var db = new TheDbContext())
    {
        db.Entry(p).State = System.Data.EntityState.Modified;                
        db.SaveChanges();       
    }

}
 

Вот мой картограф:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Person>().HasRequired(x => x.Country)
        .WithMany(x => x.Persons)
        .Map(x => x.MapKey("Country_CountryId"));

    modelBuilder.Entity<Person>().Property(x => x.RowVersion).IsRowVersion();


    modelBuilder.Entity<Country>().HasKey(x => x.CountryId);

}
 

Вот мои модели:

 public class Country
{
    public virtual Guid CountryId { get; set; }

    public virtual string CountryCode { get; set; }
    public virtual string CountryName { get; set; }

    public virtual IList<Person> Persons { get; set; }
}


public class Person
{
    public virtual Guid PersonId { get; set; }
    public virtual string Username { get; set; }

    public virtual string Firstname { get; set; }
    public virtual string Lastname { get; set; }
    public virtual byte[] RowVersion { get; set; }


    public virtual Country Country { get; set; }
}
 

Ответ №1:

Используйте это вместо этого, и оно будет работать:

 public JsonResult SaveUpdate(Person p)
{
    var country = new Country { CountryId = new Guid("EF0CD98E-7138-4757-866E-ADC3C8D216DA") };

    using (var db = new TheDbContext())
    {
        db.People.Attach(p);
        db.Countries.Attach(country);
        db.Entry(p).State = System.Data.EntityState.Modified;                
        p.Country = country;
        db.SaveChanges();       
    }
}
 

Независимые ассоциации требуют особой осторожности, поскольку каждая ассоциация сама по себе имеет свое собственное состояние, которое необходимо настроить.

Комментарии:

1. Спасибо, это работает. Нужно ли мне присоединять обе сущности? Код в порядке, даже если я просто прикрепил только объект Country

2. Вам и не нужно. Это просто более описательно без скрытых поведений.