<分区>
我有一个具有 City 属性的 Address 对象。创建要通过 EF6 插入的全新地址时,我填写了所有必需的基本地址属性(地址行 1、邮政编码等),但我不需要完全水合的 City 实例,只要它具有这样的 ID :
address.City = new City { Id = 1 };
当我尝试插入我的地址时,它还会尝试对城市的属性进行验证,但我不想对城市进行任何 CRUD,因为我只需要它的 ID。
我发现以下问题让我从 DbContext
中分离条目,这样 EF 就不会尝试对所述对象执行 CRUD:
How do I stop Entity Framework from trying to save/insert child objects?
当我分离 City 实例时似乎发生了什么,它也将其清空,因此我的地址具有空的 City 属性。这是一个问题,因为 City 也是必需的,因此会抛出 DbEntityValidationException
,提示“需要 City 字段”。
我是 EF 的新手,所以也许我处理所有这一切的方式从一开始就是错误的。
编辑 根据要求,这是我所有的代码:
在将地址实体传递到 WebApi 端点之前在我的客户端中构建我的地址实体:
var user = new AppUser { Id = 1 };
var address = new Address
{
City = new City { Id = 277 },
Line1 = "123 whatever ln",
PostalCode = "01233",
CreatedBy = user,
ModifiedBy = user,
CreatedOn = DateTime.Today,
ModifiedOn = DateTime.Today
};
在我的 ASP.NET 应用程序中,我创建了一个要从上下文中分离的实例数组:
Detached = new object[] {
value.Principle.ModifiedBy,
value.Principle.CreatedBy,
value.Principle.City
};
就在保存之前,我分离了数组中的所有实例:
foreach (var d in DetachedObjects)
{
dbContext.Entry(d).State = EntityState.Detached;
}
dbContext.SaveChanges();
我认为在分离属性时发生的事情是,它只是告诉 EF 不要对它们执行任何 CRUD,但我不希望它使它们无效,因为我想要父/主体实体拥有其 FK 的 ID。
这是我的地址和城市类:
[DebuggerDisplay("{Line1}")]
public class Address : CisEntity
{
[MaxLength(200)]
[Required]
public string Line1 { get; set; }
[MaxLength(200)]
public string Line2 { get; set; }
[Required]
public City City { get; set; }
[MaxLength(25)]
public string PostalCode { get; set; }
}
[DebuggerDisplay("{Name}, {Province.Name}, {Province.Country.Name}")]
public class City : CisEntity, IEntityName
{
[Required]
public Province Province { get; set; }
[MaxLength(100)]
public string Name { get; set; }
}