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 事情,只是因为我没有使用该工具的经验。
也许这会对其他人有所帮助。
我想事实证明你可以将主键设置为任何值,而数据库基本上会忽略它并分配自己的值。
我正在使用 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 事情,只是因为我没有使用该工具的经验。
也许这会对其他人有所帮助。
我想事实证明你可以将主键设置为任何值,而数据库基本上会忽略它并分配自己的值。