【问题标题】:OriginalValues cannot be used for entities in the Added state [duplicate]OriginalValues 不能用于处于已添加状态的实体 [重复]
【发布时间】:2018-11-12 02:14:49
【问题描述】:

我正在使用实体框架构建 Web 应用程序,数据库是在启动时创建的,我的种子方法将一些实体添加到数据库中没有任何问题。实体的检索也没有问题。

我的问题是,如果我尝试从 UI 层创建实体,则会遇到错误 OriginalValues cannot be used for entities in the Added state。异常不会被抛出到 UI,但是当我从问题中挖掘时发现它。

我发生在我的:

public virtual TEntity Add(TEntity entity)
{
    var entry = _context.Entry(entity);
    entry.State = EntityState.Added;
    _dbSet.Add(entity);

    return entity;
}

截图:

实体非常小,映射关系:

public abstract class EntityBase
{
    public int Id { get; set; }
}

public class AccessCode : EntityBase
{
    public string Code { get; set; }
    public int UsageCount { get; set; }
}

public class AccessCodeMapping : EntityTypeConfiguration<AccessCode>
{
    public AccessCodeMapping()
    {
        // Table
        ToTable("AccessCode");

        // Primary key
        HasKey(x => x.Id);

        // Properties
        Property(accesscode => accesscode.Code).IsRequired().HasMaxLength(256);
        Property(accesscode => accesscode.UsageCount).IsRequired();
    }
}

这就是我为演示目的创建测试访问代码的方式

var ac = new AccessCode {Code = "321", UsageCount = 0};
_accessCodeService.Create(ac);
_unitOfWork.Save();
return View("Login");

谁能弄清楚为什么会发生这个错误?我迷路了。 :-)

P.s 如果有一些你想看的代码,请告诉我。

【问题讨论】:

  • 你解决了吗?
  • 使用解释 OriginalValues 用途的副本关闭。很明显,添加的实体没有原始值。这只是应该被视为理所当然的众多调试器工件之一。

标签: c# entity-framework


【解决方案1】:

我曾经遇到过这个问题,并通过检查提交到数据库的字段来解决它。事实证明,我无意中试图将空值插入到设计为非空的列中。

【讨论】:

  • 在我的例子中,我将一个字段设置为比我的上下文配置中指定的限制更长的字符串。
  • 在我的情况下类似,我的数据库中有一个具有默认值的字段,但是,如果我将模型的相应属性留空,我仍然会收到此异常。这对我来说没有意义,我希望 EF 足够聪明,能够弄清楚。
  • 这个错误几乎总是由提供的错误值引起。你会在异常中发现错误。快速观察并挖掘其属性。我希望我能准确地记住它在哪里,但我保证特定领域是例外。
  • @VincentZHANG 我可以帮你。 EF 没搞清楚,但是如果你进入 edmx 模型浏览器,你可以将默认值设置为与数据库相同的值,然后就可以工作了。
  • 或者您可以只检查数据库中的数据类型....(假设您可以访问它并且 SQL Server Management Studio 可以连接到它)
【解决方案2】:

在异常下,查找:

$exception.EntityValidationErrors[n].ValidationErrors[n].ErrorMessage
$exception.EntityValidationErrors[n].ValidationErrors[n].PropertyName

其中 [n] 是数组索引(可能不止一个)。

【讨论】:

    【解决方案3】:

    我遇到了这个问题,原因是我试图将长度为 10 的字符串放入已在 DB 中更改为 25 但仍在框架中为 6 的 Varchar 列中。我删除了该属性并刷新了从数据库中,问题就消失了。

    【讨论】:

      【解决方案4】:

      检查您的模型是否有过时的非空约束列并且在数据库中具有空值,更新模型可以解决此问题。

      当 value 为 null 时,检查您是否是具有非 null 列的 SubmitChanges()。

      【讨论】:

        【解决方案5】:

        出现异常时,在visual studio中,按shift+F9并查找:

        $exception.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage
        $exception.EntityValidationErrors.First().ValidationErrors.First().PropertyName
        

        或在您的代码中

        try
        {
            //Your code
        }
        catch (System.Data.Entity.Validation.DbEntityValidationException ex)
        {
            var errorMessage = ex.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage;
            var propertyName = ex.EntityValidationErrors.First().ValidationErrors.First().PropertyName;
        }
        catch (Exception ex)
        {
            //other error
            throw ex;
        }
        

        它只是dan-iel响应的扩展

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        相关资源
        最近更新 更多