我有一个地址对象,它具有城市属性。创建要通过EF6插入的全新地址时,我会填写所有必需的基本地址属性(地址行1、邮政编码等),但我不需要完全水合的城市实例,只要它具有如下ID:
address.City = new City { Id = 1 };
当我尝试插入我的地址时,它也会尝试对城市的属性进行验证,但我不想对城市进行任何CRUD,因为我只需要它的ID。
我发现了下面的问题,它引导我从DbContext中分离条目,这样EF就不会试图对所述对象执行CRUD:
如何阻止实体框架尝试保存/插入子对象?
当我分离City实例时,似乎会发生的情况是,它也会将其置零,因此我的地址具有null City属性。这是一个问题,因为城市也是必需的,所以抛出一个“城市字段是必需的”DbEntityValidationException。
我是EF的新手,所以也许我在这方面的做法一开始就错了。
按请求编辑,以下是我的所有代码:
在将我的地址实体传递给WebApiendpoint之前,在客户端中构建我的地址实体:
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 app中,我创建了一个要与上下文分离的实例数组:
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; }
}
我相信我理解你的问题,三年后我会回答你。大声笑。
对于主实体,<代码>上下文。地址。Add(地址)
对于相关实体或子实体,上下文。条目(地址。城市)。State=EntityState。修改;
对所有其他相关实体执行此操作。
如果不希望在执行CRUD时需要城市,请删除必需的属性。如果您在程序中确实需要一个城市作为您的地址,但在数据库中不需要,那么在对地址执行CRUD之前,请按原样操作并清空城市部分。否则将插入。您应该检查一下数据库中的表是什么样子的。EF将在单独的表中跟踪这些内容,地址上的城市列将是外键。如果使用必需的属性在Address上装饰城市属性,则表示该列不可为null。这意味着在数据库中,此列必须包含城市表中记录的外键,因此城市必须存在。
当我使用实体框架保存实体时,我自然假设它只会尝试保存指定的实体。但是,它也在尝试保存该实体的子实体。这会导致各种完整性问题。如何强制EF只保存我要保存的实体并因此忽略所有子对象? 如果我手动将属性设置为null,我会收到一个错误“操作失败:无法更改关系,因为一个或多个外键属性不可为空。”这是非常适得其反的,因为我专门将子对象设置为null,因此EF不会管它。 为什么我不想保存/插入子对象? 由于这
尝试用一组新的值更新表, 如果值已经存在,那么它应该更新字段,如果不存在,那么它应该插入字段。 但是,当我运行查询时,会出现以下错误: 试图用纯SQL编写这个 插入成员(年龄、isPremiumMember、isSubscribed、lastModifiedOn)从f中选择年龄、isPremiumMember、isSubscribed、lastModifiedOn(年龄、isPremiumMemb
我有一个模型 视图定位对象: 然后它会做出一些改变(或者可能不会) 然后它尝试保存任何更改: 这里是Django尝试插入另一行而不是更新的地方,导致了一个DB错误 解决方案中有一种类似的问题: 一旦我将primary_key字段设置为自动字段,问题就消失了。 但是,我的主键已经是一个自动字段。 所以我用调试器逐步浏览了django代码,并在文件中资助了这个: 似乎如果没有更改(因此更新不做任何事情
我正在使用.NET5,并使用EF Core和作为数据库。 我有两个类,他们之间有很多对很多的关系。这些都是从模型迁移到数据库的。DB表示例 迁移: 型号: 所以当我试图更新比赛模型 我得到这个错误 对此有什么可能的解决办法?我想保持我的多对多表UDPAT,因为每次更新时,都可以被删除或添加。 可更新的锦标赛对象示例
阻止子类重写 final 可以通过标记为final来阻止一个方法、属性或者下标脚本被重写. 通过在方法、属性或者下标脚本的关键字前写final修饰符(比如final var, final func, final class func, final subscript) 此时由于加上了final修饰, 此方法不允许子类重写
问题内容: 当try块中存在时,我对try- finally执行感到困惑。据我了解,finally块将始终执行,即在返回调用方法之前。在考虑以下简单代码时: 实际打印的结果为1。这是否意味着不执行finally块?有人可以帮我吗? 问题答案: 从块返回时,返回值存储在该方法的堆栈帧中。之后,将执行finally块。 更改finally块中的值不会更改堆栈中已存在的值。但是,如果您从finally块