【问题标题】:Entity Framework - simple operation gives Format exception - Index (zero based) must be greater than or equal to zero实体框架 - 简单操作给出格式异常 - 索引(从零开始)必须大于或等于零
【发布时间】:2015-02-09 08:06:19
【问题描述】:

当我尝试执行简单的添加操作时,Entity Framework 给出了一个非常神秘的错误消息。

_context.Users.Add(new User
{
     DateJoined = DateTime.UtcNow
});
_context.SaveChanges();

FormatException:  Index (zero based) must be greater than or equal to zero and less than the size of the argument list.

用户从 IdentityUser 继承自 Microsoft.AspNet.Identity

我检查了数据库和模型,但我似乎无法确定是什么属性导致了问题。模型包含:

  1. 整数、布尔值和字符串 - 获取默认值
  2. 我提供的一个不可为空的 DateTime 属性 (DateJoined)
  3. 一个可为空的 DateTime 属性
  4. 一个正确默认为 0 的枚举
  5. 虚拟 ICollections

我不明白是什么属性导致了这个问题,我怎样才能更具体地知道?会不会是别的东西?异常对话框不包含用于查看内部异常的熟悉链接。

【问题讨论】:

  • 您是如何在 DbContext 类中初始化 Users 的?
  • 好吧,我的ApplicationDbContext 继承了IdentityDbContext<User>,因此在基类public virtual IDbSet<TUser> Users { get; set; } 上提供了用户。我没有初始化它。
  • 你确定你的建议是在实体框架的上下文中,因为我不明白你的意思。
  • 数据库中的用户主键是如何定义的?

标签: c# entity-framework entity-framework-6.1


【解决方案1】:

要了解更多信息,请尝试执行以下操作:

1) 添加Interceptor 以查看底层数据库操作。从日志中,您可以看到 INSERT 命令,并且可能通过将其与表约束进行比较来了解发生了什么。

2) 在 SaveChanges 上放置一个断点并查看来自 Context 对象的跟踪实体。确保此用户是唯一添加的实体并标记为脏。从那里你还可以看到它的属性

3)在您的模型中,将所有非强制性属性一一标记为[NonMapped]。以这种方式发现有问题的属性。如果这些属性从基类继承,您可以在数据库配置类中以编程方式将它们标记为NonMapped

4) 如果上述方法都不起作用,请尝试使用LinqPad 进行插入(来自1)),看看是否会收到更好的错误消息

希望对你有帮助

【讨论】:

    【解决方案2】:

    尝试给用户一个用户名,例如

    _context.Users.Add(new User
    {
        UserName = "Bob",
        DateJoined = DateTime.UtcNow
    });
    _context.SaveChanges();
    

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 2016-07-02
      • 2011-07-16
      • 2018-05-24
      • 2011-12-19
      • 2021-08-13
      • 2011-04-18
      • 2015-02-27
      相关资源
      最近更新 更多