Entity framework code first convert between class boolean and column integer

13,007

Solution 1

I tried the following because I do not know if Entity Framework can handle the conversion for me.

I removed this line:

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

I then added a property to my 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;
          }
     }
}

There might be a better way but this works for me for now. If any one can better this then please go ahead :)

Solution 2

 SELECT   CONVERT(A.bitcolumn as bit) as bitout

ado.net will convert bits to bools. So, just convert your integer to a bit in your select statement in t-sql.

Share:
13,007
Brendan Vogt
Author by

Brendan Vogt

Wedding photographer and videographer from Paarl, South Africa. Join me on my new adventure in wedding photography and videography at Brendan Vogt Photo & Video.

Updated on June 05, 2022

Comments

  • Brendan Vogt
    Brendan Vogt almost 2 years

    I am using Entity Framework 5 code first. My table has a column called Active and its datatype is of type int. The values that are stored in Active are 0, 1 and null.

    I have a class that I need to map to this table.

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

    Here is my configuration file. I am trying to map my boolean property in my class to the integer field in the database.

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

    This is not working well. The error that I am getting is:

    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'
    

    I tried adding .HasColumnType("bit") and thought that it might take of my problem. How do I do this? Ideally I would like 0 to be false, 1 to true, null to be null, and any other number to false.

    UPDATE

    If I change the above to:

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

    ...then I get the following error:

    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'.
    
  • tschmit007
    tschmit007 about 11 years
    the point here is: IsActive is unknown from the sql server, so if you query using this field in a where, you'll have to get all the table lines client side. BTW, have you an Ignore(x => x.IsActive) in your context ? And if not, Does the mapping run UnExceptionnaly ?
  • Brendan Vogt
    Brendan Vogt about 11 years
    No I don't have it as Ignore. No exception this way.