Учитывая эту чрезвычайно простую модель:
public class MyContext : BaseContext
{
public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
}
public class Foo
{
public int Id { get; set; }
public int Data { get; set; }
[Required]
public virtual Bar Bar { get; set; }
}
public class Bar
{
public int Id { get; set; }
}
Следующая программа не работает:
object id;
using (var context = new MyContext())
{
var foo = new Foo { Bar = new Bar() };
context.Foos.Add(foo);
context.SaveChanges();
id = foo.Id;
}
using (var context = new MyContext())
{
var foo = context.Foos.Find(id);
foo.Data = 2;
context.SaveChanges(); //Crash here
}
С DbEntityValidationException
. Сообщение, найденное в EntityValidationErrors
, является полем "Бар".
Однако, если я принудительно загружаю свойство Bar
, добавляя следующую строку до SaveChanges
:
var bar = foo.Bar;
Все работает отлично. Это также работает, если я удаляю атрибут [Required]
.
Это действительно ожидаемое поведение? Есть ли какие-либо обходные пути (помимо загрузки каждой отдельной ссылки каждый раз, когда я хочу обновить объект)