Entity Framework: отображение tinyint в логическое значение - PullRequest
10 голосов
/ 25 октября 2010

по умолчанию Entity Framework отображает tinyint в байт.

Я попытался изменить базовый тип после того, как он был сгенерирован как Boolean, но получил ошибку компиляции

Указанное членство недопустимо. Тип Edm.Boolean [Nullable = False, DefaultValue =] 'члена бла ...

возможно ли это в 4.0?

Я не думал использовать столбец tinyint в качестве логического значения. это было сделано автоматически другой командой, использующей hibernate, которая, очевидно, делает это таким образом для совместимости с mysql. очевидно, tinyint имеет больше значений, чем 2. Я ищу способ отобразить его так, чтобы anyting accept for 1 был false, или что-нибудь accept for 0 - true. любой из них будет работать для меня

есть ли способ подключить переводчик типов в EF?

Ответы [ 3 ]

5 голосов
/ 25 октября 2010

Со страницы MSDN на целочисленных типах мы видим, что тип tinyint представляет целое число в диапазоне от 0 до 255.

A bool, напротив, представляет только двоичный файл 0 или 1.

Изменение отображения по умолчанию с byte на bool (если бы это было возможно, что согласно этой странице кажется, что это не так) не имеет смысла - как, например, Вы бы представили значение 42 (действительное tinyint) как bool?

Если вам нужен объект со свойством типа bool, я бы предложил сопоставить его со столбцом типа bit.

4 голосов
/ 26 октября 2014

На самом деле основная причина, по которой часто используются целые числа в базе данных, связана с тем, что многие механизмы баз данных не допускают индексы для битовых полей. Большинство механизмов баз данных пытаются сгруппировать несколько битовых полей в один «внутренний» байт в безопасное пространство. В результате битовое поле на самом деле не доступно для индексации ..

Стандарт defacto состоит в том, что 0 равно false, а все остальные значения равны true. Однако EF не имеет поддержки для этого вида отображения. Лучший способ - использовать приватное теневое поле, объявленное как байт, которое сопоставлено с EF. Во-вторых, вы создаете псевдоним логического свойства, который используется вашим кодом.

Для отображения частных свойств с помощью EF требуется некоторый код отражения.

1 голос
/ 26 ноября 2018

Если в вашей существующей базе данных есть столбец tinyint, который вы хотите представить как логическое свойство вашего класса C #, то вы можете сделать это следующим образом:

public class Subscription
{
  public int Id { get; set; }
  public string Name { get; set; }

  // the column of your database
  public byte? autoRenew { get; set; }

  // the property you want
  [NotMapped]
  public bool Autorenew
  {
    get => autoRenew > 0;
    set { this.autoRenew = (byte)(value ? 1 : 0);  }
  }
}

Очевидно, это предполагает, что 0 и 1 соответствуютна ложь и истину соответственно.В этом примере autoRenew имеет значение null и null интерпретируется как false.

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