Entity Framework 的 CsvHelper 和主键

CsvHelper and Primary Key with Entity Framework

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

在我将 EF 添加到组合中之前一切都很顺利,因为我主要只处理 classes,没有数据库,因此没有主键!

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

我的 class 看起来像这样:

[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; }

}

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

我正在阅读上面的 class 是这样的:

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>();
}

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

我遇到的错误是:

the conversion cannot be performed

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

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

任何帮助都会很好...

所以我能够让它工作。

错误与 class 中的空主键和不可为 null 的整数有关。

所以我做了以下更改:

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

现在一切正常。

所以与 CsvHelper 无关,那部分工作得很好。这是一件 Entity Framework 事情,只是因为我没有使用该工具的经验。

也许这会对其他人有所帮助。

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