无法在Entity Framework 5中检索OriginalValues

无限

我写一个asp.net应用mvc4和我使用实体框架5.我的每一个实体都像场EnteredByEnteredOnLastModifiedByLastModifiedOn

我正在尝试通过使用SavingChanges事件自动保存它们下面的代码已从众多博客,SO答案等中汇总到一起。

public partial class myEntities : DbContext
{
    public myEntities()
    {            
        var ctx = ((IObjectContextAdapter)this).ObjectContext;
        ctx.SavingChanges += new EventHandler(context_SavingChanges);
    }

    private  void context_SavingChanges(object sender, EventArgs e)
    {

        ChangeTracker.DetectChanges();

        foreach (ObjectStateEntry entry in
                 ((ObjectContext)sender).ObjectStateManager
                   .GetObjectStateEntries
                    (EntityState.Added | EntityState.Modified))
        {         
            if (!entry.IsRelationship)
            {
                CurrentValueRecord entryValues = entry.CurrentValues;               

                if (entryValues.GetOrdinal("LastModifiedBy") > 0)
                {
                    HttpContext currContext = HttpContext.Current;
                    string userName = "";
                    DateTime now = DateTime.Now;

                    if (currContext.User.Identity.IsAuthenticated)
                    {
                        if (currContext.Session["userId"] != null)
                        {
                            userName = (string)currContext.Session["userName"];
                        }
                        else
                        {
                            userName = currContext.User.Identity.Name;
                        }
                    }

                    entryValues.SetString(
                      entryValues.GetOrdinal("LastModifiedBy"), userName);
                    entryValues.SetDateTime(
                      entryValues.GetOrdinal("LastModifiedOn"), now);

                    if (entry.State == EntityState.Added)
                    {
                        entryValues.SetString(
                          entryValues.GetOrdinal("EnteredBy"), userName);
                        entryValues.SetDateTime(
                          entryValues.GetOrdinal("EnteredOn"), now);
                    }
                    else
                    {                
                     string enteredBy = 
                  entry.OriginalValues.GetString(entryValues.GetOrdinal("EnteredBy"));
                     DateTime enteredOn =
entry.OriginalValues.GetDateTime(entryValues.GetOrdinal("EnteredOn"));

                        entryValues.SetString(
                       entryValues.GetOrdinal("EnteredBy"),enteredBy);
                        entryValues.SetDateTime(
                        entryValues.GetOrdinal("EnteredOn"), enteredOn);

                    }
                }
            }
        }
    }
}

我的问题是,entry.OriginalValues.GetString(entryValues.GetOrdinal("EnteredBy"))并且entry.OriginalValues.GetDateTime(entryValues.GetOrdinal("EnteredOn"))没有返回原始值,而是返回当前值null我对实体中的其他字段进行了测试,它们将返回以html形式输入的当前值。

我如何在这里获得原始值?

丹尼尔·JG

我认为问题可能是您使用模型绑定程序提供的实例作为控制器方法的输入,因此EF对该实体及其原始状态一无所知。您的代码可能如下所示:

public Review Update(Review review)
{
    _db.Entry(review).State = EntityState.Modified;
    _db.SaveChanges();
    return review;
}

在这种情况下,EF对于Review正在保存实例一无所知它信任您并将其设置为修改状态,因此它将所有属性保存到数据库中,但是它不知道该实体的原始状态\值。

检查本教程中名为“实体状态”的部分以及“附加和保存更改方法您还可以检查本文的第一部分,部分说明EF如何不了解原始值,并将更新数据库中的所有属性。

由于EF需要了解原始属性,因此您可以首先从数据库中加载您的实体,然后使用控制器中接收到的值更新其属性。像这样的东西:

public Review Update(Review review)
{
    var reviewToSave = _db.Reviews.SingleOrDefault(r => r.Id == review.Id);
    //Copy properties from entity received in controller to entity retrieved from the database
    reviewToSave.Property1 = review.Property1;
    reviewToSave.Property2 = review.Property2;
    ...

    _db.SaveChanges();
    return review;
}

这样做的好处是,仅修改后的属性将在数据库中发送和更新,并且视图和视图模型不需要公开业务对象中的每个字段,只需公开那些可由用户更新的字段。(打开具有viewModels和models \ business对象的不同类的门)。明显的缺点是您将对数据库造成额外的损失。

我在上面引用的教程中提到的另一个选项是让您以某种方式保存原始值(隐藏字段,会话等),并在保存时使用原始值将实体未经修改地附加到数据库上下文。然后使用已编辑的字段更新该实体。但是,除非您确实需要避免额外的数据库命中,否则我不建议您使用这种方法。

希望对您有所帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法迁移 Entity Framework Core 中的 DbContext 类

来自分类Dev

覆盖Entity Framework 5中的SaveChanges

来自分类Dev

首先,Entity Framework 5代码无法使模型正常工作

来自分类Dev

在带有Sqlite的Entity Framework 5上添加行时出错“无法更改关系”

来自分类Dev

MVC 5项目中的Entity Framework 6.0无法正常工作

来自分类Dev

首先,Entity Framework 5代码无法使模型正常工作

来自分类Dev

无法对在xUnit中执行Entity Framework Core操作的控制器运行测试

来自分类Dev

Entity Framework 6.x无法删除关系中的附加实体

来自分类Dev

在Entity Framework中嵌套嵌套

来自分类Dev

Entity Framework Core 中的 SqlGeometry

来自分类Dev

插入后在Entity Framework 5中获取记录ID

来自分类Dev

Entity Framework中的多对多关系-导致“ IEntityChangeTracker的多个实例无法引用一个实体对象”

来自分类Dev

无法在web.config中为dev,qa和prod设置Entity Framework连接字符串

来自分类Dev

从Entity Framework 6中的集合中删除

来自分类Dev

如何使用Entity Framework 6从存储过程中检索输出参数

来自分类Dev

迁移中的Entity Framework 7复合键

来自分类常见问题

从ID列表更新Entity Framework中的多行

来自分类Dev

从Entity Framework中自动生成的类继承

来自分类Dev

使用“迁移”的Entity Framework 6.0.2中的错误

来自分类Dev

在Entity Framework 6中查询多个列

来自分类Dev

未从Entity Framework中的表生成的类

来自分类Dev

在Entity Framework Core中包括集合

来自分类Dev

Entity Framework Core中的动态查询执行

来自分类Dev

与Linq相交的Entity Framework实体中的元素

来自分类Dev

使用DTO在Entity Framework中延迟加载

来自分类Dev

与Entity Framework中的3个表连接

来自分类Dev

更改Entity Framework 7中的列?

来自分类Dev

Entity Framework v6 中的 TPC

来自分类Dev

Entity Framework Core 2.1 中的 ReverseEngineeringGenerator

Related 相关文章

  1. 1

    无法迁移 Entity Framework Core 中的 DbContext 类

  2. 2

    覆盖Entity Framework 5中的SaveChanges

  3. 3

    首先,Entity Framework 5代码无法使模型正常工作

  4. 4

    在带有Sqlite的Entity Framework 5上添加行时出错“无法更改关系”

  5. 5

    MVC 5项目中的Entity Framework 6.0无法正常工作

  6. 6

    首先,Entity Framework 5代码无法使模型正常工作

  7. 7

    无法对在xUnit中执行Entity Framework Core操作的控制器运行测试

  8. 8

    Entity Framework 6.x无法删除关系中的附加实体

  9. 9

    在Entity Framework中嵌套嵌套

  10. 10

    Entity Framework Core 中的 SqlGeometry

  11. 11

    插入后在Entity Framework 5中获取记录ID

  12. 12

    Entity Framework中的多对多关系-导致“ IEntityChangeTracker的多个实例无法引用一个实体对象”

  13. 13

    无法在web.config中为dev,qa和prod设置Entity Framework连接字符串

  14. 14

    从Entity Framework 6中的集合中删除

  15. 15

    如何使用Entity Framework 6从存储过程中检索输出参数

  16. 16

    迁移中的Entity Framework 7复合键

  17. 17

    从ID列表更新Entity Framework中的多行

  18. 18

    从Entity Framework中自动生成的类继承

  19. 19

    使用“迁移”的Entity Framework 6.0.2中的错误

  20. 20

    在Entity Framework 6中查询多个列

  21. 21

    未从Entity Framework中的表生成的类

  22. 22

    在Entity Framework Core中包括集合

  23. 23

    Entity Framework Core中的动态查询执行

  24. 24

    与Linq相交的Entity Framework实体中的元素

  25. 25

    使用DTO在Entity Framework中延迟加载

  26. 26

    与Entity Framework中的3个表连接

  27. 27

    更改Entity Framework 7中的列?

  28. 28

    Entity Framework v6 中的 TPC

  29. 29

    Entity Framework Core 2.1 中的 ReverseEngineeringGenerator

热门标签

归档