当前位置: 首页 > 知识库问答 >
问题:

阻止EF尝试更新/插入子对象[重复]

赵高雅
2023-03-14

我有一个地址对象,它具有城市属性。创建要通过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; }
}

共有2个答案

邢献
2023-03-14

我相信我理解你的问题,三年后我会回答你。大声笑。

对于主实体,<代码>上下文。地址。Add(地址)

对于相关实体或子实体,上下文。条目(地址。城市)。State=EntityState。修改;

对所有其他相关实体执行此操作。

孙化
2023-03-14

如果不希望在执行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块