CsvHelper и первичный ключ с Entity Framework

Я использую Entity Framework 6.0.0.0 с замечательным инструментом Джоша Клоуз 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 Entity Framework требует, чтобы первичный ключ имел значение по умолчанию. В любом случае, возможно, есть способ игнорировать столбец в CsvHelper при обработке данных?

Я получаю следующие ошибки:

the conversion cannot be performed

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

В CSV-файле нет значения для этого поля, что, как я полагаю, является проблемой, поскольку это int, а не int?, но если это первичный ключ, я не могу сделать его допускающим значение NULL, верно?

Любая помощь здесь была бы замечательной ...


person gotmike    schedule 09.05.2017    source источник
comment
@ ПолЭбботт, моя вина ... опечатка. следует прочитать var pr = csv.GetRecord<P>();   -  person gotmike    schedule 10.05.2017


Ответы (1)


Так что я смог заставить его работать.

Ошибка связана с пустым первичным ключом в классе с целым числом, не допускающим значения NULL.

Итак, я сделал следующее изменение:

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

И теперь все работает нормально.

Так что ничего общего с CsvHelper, эта часть отлично работает. Это было связано с моей неопытностью в использовании инструмента Entity Framework.

Может быть, это кому-то поможет.

Я думаю, оказывается, что вы можете установить первичный ключ на любое значение, и БД в основном проигнорирует его и все равно присвоит собственное значение.

person gotmike    schedule 10.05.2017