entity-framework - 防止 EF 尝试更新/插入子对象

标签 entity-framework entity-framework-6

<分区>

我有一个具有 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; }
}

最佳答案

如果您不希望在执行 CRUD 时需要城市,请删除所需的属性。如果您在程序中确实需要一个城市作为您的地址,而不是在数据库中,那么请按原样操作并在对地址执行 CRUD 之前清空城市部分。否则会被插入。你应该去看看你的表在你的数据库中是什么样子的。 EF 将在单独的表中跟踪这些,Address 上的 City 列将是一个外键。如果您使用必需属性修饰 Address 上的 City 属性,则意味着该列不可为空。这意味着在数据库中,此列必须包含城市表中记录的外键,因此城市必须存在。

关于entity-framework - 防止 EF 尝试更新/插入子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748361/

相关文章:

iphone - 如何像在 Entity Framework 中一样在核心数据中将属于一个类文件中的一个实体的方法分组?

entity-framework - Entity Framework edmx点击图很慢

c# - Entity Framework - 如何避免查询重新编译?

c# - 我如何首先使用带有 ef 代码的 wcf 数据服务公开 dto 对象?

c# - 在 Ubuntu 16.04 上使用 Entity Framework

entity-framework - 为什么 DbContext 实现了 IObjectContextAdapter 但没有公共(public) ObjectContext 属性

javascript - 获取外键表数据

asp.net-mvc - 如何与asp身份用户建立一对多关系

c# - EF6.x CodeFirst 一对多关系

c# - 设置 1 :0. .1 关系,以便清空引用会自动删除引用的对象?