在Entity Framework 4.1中将数据库中的字符串转换为布尔属性

3

我正在处理一个使用字符字面量 T 和 F 作为布尔值的遗留 Oracle 数据库,但是我希望实体属性反映正确的布尔值。在模型绑定时是否有一种方法可以转换此值?由于这是只读数据库,因此插入操作并不重要。

2个回答

5

这是不可能的。您需要将一个字符串属性映射到数据库表列,然后使用一个未映射的布尔属性:

public string MyStringProperty { get; set; }

[NotMapped]
public bool MyBoolProperty
{ 
    get { return MyStringProperty == "T"; }
    set { MyStringProperty = value ? "T" : "F"; }
}

3
该死,我真的希望能让模型POCO对数据库的映射保持无知,如果有一种在属性映射中使用流畅API实现这一点的方法,那将非常好。 - Chris McGrath
4
@Chris: 告诉ADO.NET团队。他们仍然忽视简单类型映射的需求。 - Ladislav Mrnka

2
我建议对生成类型进行包装或扩展,以添加此类功能...
实体框架会生成与数据库表中数据基本匹配的对象,因此如果您有一个名为“Contacts”的表,您将获得一个名为“Contacts”的对象。我认为(虽然我可能错了),这些类被定义为部分,因此它会生成类似于...
public partial class Contact { 
  string BoolReally { 
    get; set;
  };
}

然后你可以像这样添加一个新属性...

public partial class Contact { 
  bool MyBool get { 
    return (legacyValue == "T") ? true : false;
  }
}

现在当您声明一个联系人实例时,只需从"MyBool"中获取值即可。
...
这是扩展,封装的示例代码如下...
public class MyContact {
     public Contact Contact;
     public bool MyBool { 
         get { 
             return Contact.BoolAsString; 
         }
     }
}

类似的事情...只需要稍微不同的方式来使用这个对象 :)


3
这样做的缺点是MyBool属性无法在LINQ查询中使用,因为EF无法将这样的查询翻译成SQL。 - Steven
不过,在旧的字符串属性上使用相同逻辑的 Linq 查询没有任何问题。这种方法有点棘手,但是没有什么能阻止你使用它。我的理想情况是在数据库中创建一个计算字段,这样就可以将位列转换为你的 POCO/实体,并在 Linq 中使用它。 - War
只需通过几个SQL更新语句,将列进行转换(一个用于表格,一个用于将数据复制到位列)。 - War
不使用属性,我只定义方法(即使是类似属性的行为)。这使得它更明显,该对象不能在 LINQ 查询中使用。 - Steven
不错的判断。我猜这又是一个编码标准的问题,对于你或者你所在的公司来说,这方面可能会有所不同。 - War

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接