保存有时存储生成的列的最佳方法

时间:2014-01-20 21:04:52

标签: entity-framework

我有一个实体,其中一列有奇怪的行为。在插入时,有时它被设置为应用程序传递的值,有时它使用来自另一列的新创建的标识值。目前使用存储过程实现。有没有一种干净的方法来实现Entity Framework?

我正在使用Entity Framework 6和Code First,但我不是在进行数据库生成或使用迁移。

我知道我基本上可以使用DbContext.Database来手动调用过程,就好像我没有使用EF一样,但是我在保存,参与SaveChanges事务等时丢失了所有EF的实体自动更新。什么是减轻这种情况的最佳方法?

编辑: 我将尝试用伪代码描述我理想的解决方案。问题是,在实体框架6的当前功能给出真实代码的情况下,我真的能接近这一点。

理想情况下,我可以将列配置为有时是“标识”列。换句话说,有时在插入时由数据库生成,有时不会。像这样:

public sealed class WidgetConfiguration : EntityTypeConfiguration<Widget>
{
    public WidgetConfiguration()
    {
        HasKey(d => d.Id);
        Property(e => e.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        Property(e => e.Number)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.SometimesIdentity);
        MapToStoredProcedures(s => s.Insert(i => i.HasName("InsertWidget")));
    }
}

由于这是不可能的,我想知道是否有其他方式参与SaveChanges,以便我可以利用EF善良,如依赖性分析和自动事务管理,而不是:

  1. 创建交易
  2. 使用Widget所依赖的新/已更改实体填充上下文并保存它。
  3. 插入小工具。
  4. 使用依赖于Widget并保存的新/已更改实体填充上下文。
  5. 提交交易。
  6. 换句话说,是否有可能告诉EF,“嘿,我知道如何保存小部件。当你需要保存小部件时,这是一个回调。”或类似的东西?

1 个答案:

答案 0 :(得分:0)

EF不刷新可能受StoredProcedure影响的实体,您必须通过调用手动执行此操作:

dbContext.Entry(myEntityToRefresh).Reload();
//or
dbContext.Entry(myEntityToRefresh).ReloadAsync();

请更改此问题的标题。它没有说什么。