【问题标题】:CsvHelper and Primary Key with Entity Framework实体框架的 CsvHelper 和主键
【发布时间】:2017-05-09 23:46:36
【问题描述】:

我正在使用 Entity Framework 6.0.0.0 和 Josh Close 的出色 CsvHelper 工具。

在我添加 EF 之前一切都很好,因为我主要处理类,没有数据库,因此没有主键!

所以现在我已经确认我的主键已在数据库中正确设置为自动递增标识。

我的班级看起来像这样:

[Table("tbl_P")]
public class P // PData File
{
    // Column P1
    public string StrTrId { get; set; }

    // NOTE COLUMNS P2-P99 GO HERE

    // Column P99
    public string StrCo { get; set; }

    // Column P100
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int pk_PropertyId { get; set; }

}

请注意,我将主键放在最后,希望这将有助于映射工作,而不必以某种方式移动列。

我正在像这样阅读上面的课程:

var csv = new CsvReader(reader);
csv.Configuration.HasHeaderRecord = false;
csv.Configuration.WillThrowOnMissingField = false;
csv.Configuration.TrimFields = true;

while (csv.Read())
{
    var pr = csv.GetRecord<P>();
}

所以我不确定问题是否与我将主键放在类的末尾有关,或者它是否是 b/c 实体框架要求主键具有默认值。无论哪种方式,当我处理数据时,也许有一种方法可以忽略 CsvHelper 中的列?

我得到的错误是:

the conversion cannot be performed

"Row: '1' (1 based) Type: 'P' Field Index: '99' (0 based)"

该字段的 CSV 文件中没有值,我想这是问题所在,因为它是 int 而不是 int?,但如果它是主键,我不能将其设为可为空,对吗?

这里的任何帮助都会很棒...

【问题讨论】:

  • @PaulAbbott -- 我的错......错字。应该是var pr = csv.GetRecord&lt;P&gt;();

标签: c# sql-server entity-framework csvhelper


【解决方案1】:

所以我能够让它工作。

错误与具有不可为空整数的类中的空主键有关。

所以我做了以下更改:

// Column P100
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int? pk_PropertyId { get; set; } = null

现在它工作正常。

所以与 CsvHelper 无关,那部分工作得很好。这是一个实体框架的事情,与我使用该工具的经验不足有关。

也许这对其他人有帮助。

我猜你可以将主键设置为任何值,数据库基本上会忽略它并分配自己的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多