Как мне сопоставить свойство char, используя свободный API Entity Framework 4.1 «только код»? - PullRequest
44 голосов
/ 20 июля 2011

У меня есть объект со свойством char:

public class Product
{
    public char Code
    {
        get;
        set;
    }
}

Кажется, что Entity Framework не может отображать символы (это поле отсутствует в базе данных, когда я создаю схему базы данных из моегомодельные объекты).Могу ли я в любом случае сопоставить символ (например, строку), используя свободный API?Я не хочу менять объекты модели, поскольку они являются частью устаревшей общей библиотеки.

Ответы [ 4 ]

69 голосов
/ 20 июля 2011

Char не является допустимым типом примитива для структуры объекта = структура объекта не отображает его.Если вы отметите CSDL-ссылку , вы увидите список допустимых типов (char среди них нет).

База данных char(1) переведена как string ( SQL дляCSDL перевод ).Char описывается как не-юникодная строка с фиксированной длиной 1 .

Единственная уродливая опция - это второе сопоставленное свойство, использующее строку, а ваше char не сопоставленное свойство будет просто использовать string[0] от этой собственности.Это просто еще один пример того, как в EF чертовски не хватает простого преобразования типов или преобразователей.

29 голосов
/ 09 февраля 2015

В Fluent API вы можете указать тип данных столбца базы данных, используя метод HasColumnType, например:

modelBuilder.Entity<Product>()   
.Property(p => p.Code)   
.HasColumnType("char");

Согласно ответу Андре Артуса здесь , HasColumnType доступен в EF4.1.

Для тех, кто использует аннотации данных, атрибут ColumnAttribute может выполнить то же самое.

[Column(TypeName="char")]
public string Code { get; set; }
1 голос
/ 13 марта 2019

Я испробовал все способы, которые я себе представил, и должен сказать, что принятый ответ - это единственный способ решить проблему типа char, насколько я знаю.

Тип char недоступен для использования в EntityFramework.

Свободное API включено в это ограничение.

Если вы попытаетесь поставить char на Property(p => p.MyCharProperty), вы получите Exception .

Это означает, что свойства char недоступны ни для Fluent API, ни для атрибутов.

Самое простое решение - это (по предложению Ладислава Мрнки).

public class Product
{
    public char Code { get; set; }

    [Column("Code", TypeName="char")]
    [MaxLength(1)]
    public string CodeString
    {
         get { return Code.ToString(); }
         set { Code = value[0]; }
    }
}

Одно примечание: вы не можете сделать собственность частной, защищенной или внутренней. Должен быть публичным .

Свободная версия API будет выглядеть следующим образом.

public class Product
{
    public char Code { get; set; }

    //We need the property but we will use the Fluent API to replace the attributes
    public string CodeString
    {
         get { return Code.ToString(); }
         set { Code = value[0]; }
    }
}

modelBuilder.Entity<Product>().Property(p => p.Code)
    .HasTypeName("char")
    .HasMaxLength(1)
0 голосов
/ 04 декабря 2018

Существуют альтернативные способы решения этой проблемы только для целей ТЕСТИРОВАНИЯ.Сделайте поле от нуля до нуля способным на время выхода из режима разработки.Иногда это ограничивается SQL Management Studio.(Изменить настройки Инструменты -> Опция -> Дизайнер -> Дизайнер базы данных таблиц -> Снимите флажок «Запретить сохранение изменений, которые требовали создания таблицы»

...