OriginalValues不能用于处于已添加状态的实体

时间:2014-03-15 09:40:14

标签: c# entity-framework

我正在使用Entity Framework构建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;
}

截图:

enter image description here

实体非常小且映射:

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");

任何人都可以找出发生此错误的原因吗?我迷路了。 : - )

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

5 个答案:

答案 0 :(得分:46)

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

答案 1 :(得分:25)

在例外情况下,请查找:

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

其中[n]是数组索引(可能有多个)。

enter image description here

答案 2 :(得分:5)

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

答案 3 :(得分:1)

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

当value为null时,检查您是否是一个非空列的SubmitChanges()。

答案 4 :(得分:0)

在发生异常时,在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响应的扩展