Brendan Vogt
Brendan Vogt

Reputation: 26018

Entity framework code first convert between class boolean and column integer

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'.

Upvotes: 6

Views: 15634

Answers (3)

TotPeRo
TotPeRo

Reputation: 6781

In Entity Framework Core you can use Value Conversions like this:

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

Similar question like this

You can learn more here

Upvotes: 0

1c1cle
1c1cle

Reputation: 433

 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.

Upvotes: 1

Brendan Vogt
Brendan Vogt

Reputation: 26018

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 :)

Upvotes: 1

Related Questions