Учитывая эту чрезвычайно простую модель:
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 является обязательным. .
Однако, если я принудительно загрузю свойство Bar
, добавив следующую строку перед SaveChanges
:
var bar = foo.Bar;
Все работает нормально. Это также работает, если я удалю атрибут [Required]
.
Это действительно ожидаемое поведение? Существуют ли какие-либо обходные пути (помимо загрузки каждой необходимой ссылки каждый раз, когда я хочу обновить объект)