C# 原始值不能用于处于添加状态的实体

C# 原始值不能用于处于添加状态的实体,c#,entity-framework,C#,Entity Framework,我正在使用实体框架构建一个web应用程序,数据库是在启动时创建的,我的seed方法将一些实体添加到数据库中,没有任何问题。此外,实体的检索工作也没有问题 我的问题是,如果我尝试从UI层创建实体,我会遇到错误OriginalValues不能用于处于添加状态的实体。异常不会被抛出到UI,但我在深入研究问题时发现了它 我发生在我的生活中: public virtual TEntity Add(TEntity entity) { var entry = _context.Entry(entity

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

我的问题是,如果我尝试从UI层创建实体,我会遇到错误
OriginalValues不能用于处于添加状态的实体
。异常不会被抛出到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();
    }
}
有人能找出发生此错误的原因吗?我迷路了。:-)


请告诉我您是否希望看到一些代码。

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

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


当值为null时,请检查您是否是具有not null列的SubmitChanges()。

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

在异常情况下,查找:

$exception.EntityValidationErrors[n].ValidationErrors[n].ErrorMessage
$exception.EntityValidationErrors[n].ValidationErrors[n].PropertyName
$exception.EntityValidationErrors.First().ValidationErrors.First().ErrorMessage
$exception.EntityValidationErrors.First().ValidationErrors.First().PropertyName
其中[n]是数组索引(可能有多个)


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

$exception.EntityValidationErrors[n].ValidationErrors[n].ErrorMessage
$exception.EntityValidationErrors[n].ValidationErrors[n].PropertyName
$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;
}

这只是响应的扩展

在我的情况下,我将一个字段设置为比上下文配置中指定的长度更长的字符串。与我的情况类似,我的数据库中有一个具有默认值的字段,但是,如果我将模型的相应属性保留为空,我仍然会收到此异常。这对我来说没有意义,我希望EF足够聪明来解决这个问题。这个错误几乎总是由提供的错误值造成的。您将在异常中找到错误。快速观察并挖掘其属性。我希望我能准确地记得它在哪里,但我保证特定领域是例外。@VincentZHANG我可以在这方面帮助你。EF没有弄清楚,但如果进入edmx模型浏览器,可以将默认值设置为与数据库相同的值,然后它就会工作。或者,您可以只检查数据库中的数据类型。。。。(假设您有权访问它,并且SQL Server Management Studio可以连接到它)您解决了这个问题吗?使用一个副本关闭,该副本解释了
OriginalValues
的用途。显然,添加的实体没有原始值。这只是许多应该被视为理所当然的调试器工件之一。请不要重复。这只会增加噪音。