【问题标题】:How can I find out the line that caused the error in entity framework?如何找出导致实体框架错误的行?
【发布时间】:2021-08-12 17:40:27
【问题描述】:

我正在我的数据库中添加一系列数据。

IList<Data> items = //326 rows of data

using(MyDataContext c = new MyDataContext()){
     c.MyTable.AddRange(items);
     c.SaveChanges();
}

但有时它会抛出如下所示的 DbUpdateException。

ORA-12899:SM.TB.NAME 列的值太大(实际值:265,最大值:255)

但是我看不懂是哪一行数据?我怎样才能找到它?

我应该向用户返回一条警告消息,此数据无效。

【问题讨论】:

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


    【解决方案1】:

    与我的 dbcontext 的 MyTable 关联的 SM.TB DB 表的 Name 列大小太小 - 255 个字符,您至少需要 265 个字符。您必须更改 MyTable 类的属性名称

    [Column(TypeName = "VARCHAR2")]
     [StringLength(512, MaximumLength = 255)]
    public string Name{ get; set; }
    

    或者流利的Api

    modelBuilder.Entity<MyTable>()
      .Property(e => e.Name).HasColumnType("VARCHAR2").HasMaxLength(255);
    

    如果您确实需要超过 255 个,请将数字更改为您期望的 Max。

    将表迁移到数据库。或者,如果您知道如何,您可以直接在 OracleDb 中更改它。使用这个脚本

    ALTER TABLE SM.TB
    MODIFY Name VARCHAR2( 512 );
    

    作为一种解决方法,只需添加名称长度检查代码(请参阅@kaffekopp 的答案)并在可能的情况下将字符串剪切为 255

    【讨论】:

    • 这是解决问题的另一种方法,但 OP 要求检测导致错误的记录并相应地提醒用户。
    • 如果用户添加800个字符长度的数据?我想知道哪些数据是无效的。
    • 有没有办法使用类似 StringLength 属性来验证模型类?
    • 是的,我更新了我的答案。您可以使用此属性进行验证。
    • 但我有 50 列和许多不同的模型。这是手动完成的很长的路要走。
    【解决方案2】:

    您应该在尝试保存数据之前对其进行验证。也许是这样的:

    // Find the invalid items
    var invalidItemIds = items
        .Where(x => x.Name.Length > 255)
        .Select(x => x.Id);
    
    if (invalidItemIds.Any())
    {
        // If there is invalid items, handle it the way of your choice
        throw new Exception($"The name is too long for items: {string.Join(",", invalidItemIds)}");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多