实体框架代码首先在类boolean和列整数之间进行转换

时间:2013-03-07 09:39:07

标签: entity-framework entity-framework-4 ado.net entity-framework-4.1 entity-framework-5

我正在使用Entity Framework 5 code first。我的表有一个名为Active的列,其数据类型为int。存储在“有效”中的值为01null

我有一个我需要映射到此表的类。

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

     public bool? IsActive { get; set; }
}

这是我的配置文件。我试图将我的类中的布尔属性映射到数据库中的整数字段。

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为真,null为null,其他任何数字为false。

更新

如果我将上述内容更改为:

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

2 个答案:

答案 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;
          }
     }
}

可能有更好的方法,但现在这对我有用。如果任何人可以更好,那么请继续:)

答案 1 :(得分:1)

 SELECT   CONVERT(A.bitcolumn as bit) as bitout

ado.net会将比特转换为bools。因此,只需将整数转换为t-sql中select语句中的一位。