C# 实体框架、现有数据库、代码优先-忽略Db列并更改数据类型

C# 实体框架、现有数据库、代码优先-忽略Db列并更改数据类型,c#,entity-framework,.net-4.0,ef-code-first,C#,Entity Framework,.net 4.0,Ef Code First,我使用的是EntityFramework4.3(如果EF不能满足我的需要,我愿意接受关于更改此框架的建议) 我有一些实体/业务对象。这些对象不应该更改,不应该被注释(没有DataAnnotation属性),不应该为解决方法添加内部成员,并且数据库也设置为stone/超出我的控制范围。简而言之,数据库不能更改,我的实体也不能更改。起初,这听起来像是使用fluentapi的完美理由 public class MyEntity { public int MyEntityId { get; se

我使用的是EntityFramework4.3(如果EF不能满足我的需要,我愿意接受关于更改此框架的建议)

我有一些实体/业务对象。这些对象不应该更改,不应该被注释(没有DataAnnotation属性),不应该为解决方法添加内部成员,并且数据库也设置为stone/超出我的控制范围。简而言之,数据库不能更改,我的实体也不能更改。起初,这听起来像是使用fluentapi的完美理由

public class MyEntity
{
    public int MyEntityId { get; set; }
    public string Name { get; set; }
    public bool IsGreen { get; set; }
}
假设该对象在数据库中与之相关的表如下所示:

CREATE TABLE [dbo].[MyEntities]
(
MyEntityId INT NOT NULL,
Name VARCHAR(30) NOT NULL,
IsGreen CHAR(1) NOT NULL,
ForeignKeyId INT NULL
)
如果SQL错误,请道歉,快速手动键入

希望你能马上注意到一些冲突

问题1)是否可以通过Fluent API将布尔值映射到IsGreen CHAR(1)NOT NULL字段,而不向原始实体添加变通方法属性?此列不可为Null,用于填充布尔的表达式可能如下所示:

x => new MyEntity() { IsGreen = x.IsGreen == "Y" }
问题2)上下文是否允许我将MyEntity插入数据库,尽管并非所有列都被映射,只要未映射的列可为空,即使存在外键

问题3)如果EF不能做到上述,是否有一个框架可以做到

以下是我迄今为止所尝试的: 尝试1: 我开始基于DB模式创建单独的实体,然后创建冗长的表达式,以便能够从一个表达式转换到另一个表达式

这可能最终奏效了,但忽略了它所花费的荒谬时间,它创造了一个新的问题;where子句的my
Expression
expressions显然不能再在数据库中应用,而是必须将所有记录带回来,编译表达式,并将其应用于结果可枚举项

这还不够好不幸的是,带回的数据太多了。我本可以花一些时间编写代码,遍历表达式并将
MemberAccess
节点映射到新实体,但这似乎不必要地复杂


尝试2

然后,我尝试创建继承类,该类可以包含变通属性,在其setter中设置实际属性,而实际属性通过fluentapi被忽略。多亏了继承,我前面提到的where表达式才应该起作用

但是,继承是由EF发现的,由于模式与它似乎期望的实体的继承层次结构不匹配,我无法再查询数据库。(我理解这有点模糊,但是考虑EFF的TPH/TPT/ETC方面,以及这不一定匹配我的模式——我认为这是我最近的尝试,但是我不知道如何通过FLUENT API来纠正这些问题)。
尝试3: 最后,我试着和设计师修补一下。关于这一点我没什么好说的,只是我不再去摆弄设计师了


注意:这个软件需要在几个不同的数据库上运行,这些数据库每次都不会有完全相同的模式,这就是为什么举例来说,我需要代码来工作,即使我的模型不一定对数据库中的每个列都有属性。不仅如此,我还不知道,在软件发布之前,数据库可能有多少列或哪些额外的列,我只知道这些列是可以为null的,因此我应该能够插入到表中,只知道核心非null列(MyEntity对象上存在的列)。我认为,仅此一点就排除了设计师的可能性


抱歉的文字墙-任何帮助感谢

答案1:否。EF目前不支持将
char(1)
映射到
bool
。你可以投票支持我

回答2:如果所有未映射的列都可为空或定义了默认值约束,则为“是”


回答3:NHibernate

谢谢@Ladislav。我投票赞成你的建议,完全同意。我在过去看到过很多关于“EF是垃圾,使用NHibernate”的评论,但通常没有太多的理由。对于示例
MyEntity
,您能否提供一个实现上述所有要求所需的代码的快速示例?另外,值得注意的是,我遇到的关于Fluent NHibernate的第一个教程明确指出,实体的属性必须是虚拟的。这已经与我的要求相冲突(无法更改实体)。如果您想要像延迟加载这样的高级ORM功能,则需要虚拟属性。您最初的问题是关于EF的,因此为NHibernate提供样品是不合适的。原始问题的第一行确实说明,如果EF不能满足我的需要,欢迎使用EF的替代品。我理解如果你没有时间提供一个例子。