我正在使用带有Npgsql 2.2.5驱动程序的Entity Framework 6.1。实体public class MyEntity{ public bool Deprecated { get; set; }}制图public class MyEntityMap : EntityTypeConfiguration<MyEntity>{ public MyEntityMap () { Property(t => t.Deprecated) .HasColumnName("status") .HasColumnType("Integer") .IsOptional(); }}当我尝试从数据库中读取某些内容时,出现一个异常,该异常与具有映射关系的内容没有直接关系:  InvalidOperationException“序列不包含任何匹配元素”(从德语翻译,不知道确切的英文文本)是否可以将布尔属性存储为整数?我做了一个变通办法,引入了一个类型为int的新属性Status,该属性映射到status列。然后,将NotMapped属性添加到Deprecated,使其在其吸气剂中返回Status != 0并将Status设置为1或0。它可以工作,但是现在我不能在linq查询中使用Deprecated。我只是更改了列的数据类型,但是也有一个使用该数据库的旧系统。引入新的列并使两者与某些数据库触发器保持同步将是一个解决方案,但是我的模型存在其中一些问题。所以我想有一个更通用的解决方案。有没有更好的办法? 最佳答案 是的...这里同样的问题。我认为除非您修改了npgsql EF提供程序的源,否则没有一种干净的方法。public static class DbValue{ public const int FALSE = 0; //or something like this}public class MyEntity{ [Column("Deprecated")] public integer DeprecatedStatus { get; set; } [NotMapped] public bool DeprecatedBool { get { this.DeprecatedStatus != 0 } set { this.DeprecatedStatus = (value ? 1 : 0) } }}//Then in Linqdb.MyEntities.Where(e => e.DeprecatedStatus == DbValue.FALSE);//anddb.MyEntities.Where(e => e.DeprecatedStatus != DbValue.FALSE);哦,嘿,我刚想到另一个主意。您可以在代码中编写Expression对象并将其传递到Linq中(因为IQueryable 使用表达式)像这样:public class MyEntity{ public static Expression<Func<MyEntity, bool>> IsDeprecated = (myEntity) => myEntity.Deprecated != 0; public static Expression<Func<MyEntity, bool>> IsNotDeprecated = (myEntity) => myEntity.Deprecated == 0; public integer Deprecated{ get; set; }}//Then in Linqdb.MyEntities.Where(MyEntity.IsDeprecated);//anddb.MyEntities.Where(MyEntity.IsNotDeprecated);对于初学者来说,使用表达式而不是Func的原因可能会有些混乱,但是如果您对lambda表达式感到满意,那么使用该模式当然很容易。我以前做过这种事情,而且行得通。无效的是尝试在运行时动态创建您的Expression对象,因为EF代码中出现了问题。 (只有编译器极客会考虑这样做)因此,这里的缺点是,每当您在LINQ中具有要使用Deprecated属性的表达式时,就必须创建另一个静态表达式对象。关于c# - 使用Npgsql和Entity Framework将bool属性存储为整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31400852/
10-12 14:55