3

Я использую Entity Framework 5 code first. В моей таблице есть столбец Active, а его тип данных имеет тип int. Значения, которые хранятся в активном состоянии, - 0, 1 и null.Код структуры Entity сначала конвертирует между классом boolean и integer столбца

У меня есть класс, который мне нужно сопоставить с этой таблицей.

public class CommandExecutionServer : IEntity 
{ 
    public int Id { get; set; } 

    public bool? IsActive { get; set; } 
} 

Вот мой конфигурационный файл. Я пытаюсь сопоставить свое свойство boolean в моем классе с целым полем в базе данных.

class CommandExecutionServerConfiguration : EntityTypeConfiguration<CommandExecutionServer> 
{ 
    internal CommandExecutionServerConfiguration() 
    { 
      this.ToTable("tblCommandExecutionServers"); 
      this.Property(x => x.IsActive).HasColumnName("Active").HasColumnType("bit"); 
    } 
} 

Это не работает. Ошибка, я получаю это:

The 'IsActive' property on 'CommandExecutionServer' could not be set to a 'Int32' value. You must set this property to a non-null value of type 'Boolean' 

Я попытался добавить .HasColumnType("bit") и подумал, что это может занять от моей проблемы. Как мне это сделать? В идеале я бы хотел, чтобы 0 было ложным, 1 - true, null - null, а любое другое - false.

UPDATE

Если я изменю выше:

this.Property(x => x.IsActive).HasColumnName("Active").HasColumnType("int"); 

... тогда я получаю следующее сообщение об ошибке:

Member Mapping specified is not valid. The type 'Edm.Boolean[Nullable=True,DefaultValue=]' of member 'IsActive' in type 'MyProject.Infrastructure.EntityFramework.CommandExecutionServer' is not compatible with 'SqlServer.int[Nullable=True,DefaultValue=]' of member 'Active' in type 'CodeFirstDatabaseSchema.CommandExecutionServer'. 
+0

Вы пробовали с HasColumnType ("int")? С той же проблемой я задал тип столбца для бит в SQL-сервере. – tschmit007

+0

Смотрите мое обновление выше. Да, я также хотел бы установить его бит, но это не мой сервер, поэтому я не могу пойти на изменение структуры таблиц :) –

ответ

1

Я попытался следующие, потому что я не знать, может ли Entity Framework обработать преобразование для меня.

я удалил эту строку:

this.Property(x => x.IsActive).HasColumnName("Active").HasColumnType("int"); 

Затем я добавил свойство к моему CommandExecutionServer class:

public class CommandExecutionServer : IEntity 
{ 
    public int Id { get; set; } 

    public int? Active { get; set; } 

    public bool IsActive 
    { 
      get 
      { 
       return (Active == 1) ? true : false; 
      } 
    } 
} 

Там может быть лучше, но это работает для меня на данный момент. Если кто-нибудь может это сделать лучше, пожалуйста, продолжайте :)

+2

Дело здесь: IsActive неизвестно на сервере sql, поэтому, если вы запрашиваете это поле в том месте, где , вам нужно будет получить все клиентские стороны строк таблицы. Кстати, у вас есть Игнорировать (x => x.IsActive) в вашем контексте? А если нет, выполняется ли отображение UnExceptionnaly? – tschmit007

+0

Нет, у меня его нет, как игнорировать. Никаких исключений. –

1
SELECT CONVERT(A.bitcolumn as bit) as bitout 

ado.net преобразует бит в bools. Итак, просто преобразуйте свое целое число в ваш оператор select в t-sql.

+0

отлично, спасибо –