【问题标题】:Updating foreign key in Entity Framework 7在 Entity Framework 7 中更新外键
【发布时间】:2016-07-29 09:49:36
【问题描述】:

我正在尝试使用 Entity Framework 7 更新外键。但它给出了错误:在对象“X”中找不到属性“Y”。我尝试了许多不同的解决方案,但仍然无法正常工作。示例代码:

class X
{
  property Y {get; set;} -> property Y is a foreign key and also a complex type
}

在表“X”中,我们有一个列“Y_ID”,它是外键。

注意:我只想更新外键。例如。 最初类'X'指向'NULL'我想更新类'X'指向'Y1'

Entity Framework 7 代码:

var x = this.GetX();
this.mainContext.Xs.Attach(x);
var xEntry = this.mainContext.Entry(x);

xEntry.Property("Y").CurrentValue = "Y1"; // Error at this line

await this.mainContext.SaveChangesAsync().ConfigureAwait(false);

详细错误:

找不到实体类型“X”的属性“Y”。确保该属性存在并且已包含在模型中。

编辑

Fabien 在他的评论中建议的方法效果很好。但问题是我们只知道在运行时要更新哪个属性。如果我使用反射来实现这一点,问题是实体框架将对象视为新对象并尝试创建它(INSERT),然后引发主键违规(不允许重复条目)

那么,有没有办法让我仍然无法更新在 EF 中充当外键的对象属性? (我不知道编译时的确切属性)。

【问题讨论】:

    标签: c# sql-server entity-framework foreign-keys entity-framework-core


    【解决方案1】:

    如果您从上下文中获取实体“X”和“Y”,则 ChangeTracker 会自动跟踪它们。因此,如果您将“X”对象的“Y”属性分配给从上下文中检索到的“Y”实例并调用 SaveChanges 或 SaveChangesAsync,EntityFramework 将自动为您完成这些工作。

    var x = this.GetX();    
    x.Y = "Y1";
    await this.mainContext.SaveChangesAsync().ConfigureAwait(false);
    

    按照惯例,对象“X”上的属性“Y”应该是虚拟的,以表明它是外键。


    编辑1:

    如果我理解正确,您希望在运行时动态更新对象的属性,其值来自 Web api。

    第一种方式:

    就像你做的那样,你可以将你的“X”对象附加到你的上下文实例中,以使用 EntityState.Unchanged 开始跟踪实体,然后标记每个需要更新的属性:

    this.mainContext.Xs.Attach(x);
    var entry = this.mainContext.entry(x);
    entry.Property(p => p.Y).CurrentValue = "Y1";
    await this.mainContext.SaveChangesAsync().ConfigureAwait(false);
    

    附加实体时,可以指定GraphBehavior,它告诉EntityFramework是否应该遍历导航属性。

    第二种方式:

    使用 DbSet.Update() 方法:

    this.mainContext.Xs.Update(x);
    await this.mainContext.SaveChangesAsync().ConfigureAwait(false);
    

    它会自动开始跟踪状态为 EntityState.Modified 的实体,所有属性都将被标记为已修改。使用此方法时应注意,因为所有属性都会更新,如果其中一些属性未在“X”对象中初始化,则可能会丢失一些数据。为防止出现这种情况,您应该始终验证输入。


    如果您想让您的领域模型与任何 ORM 分离,那么您应该考虑将实体类型和领域类型分开。您可以使用 Automapper 之类的对象映射器将实体映射到域类型,反之亦然。通过这种方式,您可以清楚地区分您在数据访问层和业务逻辑层所做的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      相关资源
      最近更新 更多