c# - Entity Framework 、现有数据库、代码优先 - 忽略数据库列和更改数据类型

标签 c# entity-framework .net-4.0 ef-code-first

我正在使用 Entity Framework 4.3(如果 EF 无法满足我的需要,我愿意接受更改此设置的建议)。

我有一些实体/业务对象。这些对象不应更改,不应进行注释(无 DataAnnotation 属性),不应添加内部成员作为解决方法,并且数据库也是一成不变的/超出我的控制范围。简而言之,数据库不能改变,我的实体也不能改变。乍一看,这听起来像是使用 Fluent API 的完美理由。

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 将我的 bool 值映射到 IsGreen CHAR(1) NOT NULL 字段,而无需添加解决方法 原始实体的属性?此列不可为空,填充 bool 值的表达式可能类似于:

x => new MyEntity() { IsGreen = x.IsGreen == "Y" }

问题 2)上下文是否允许我将 MyEntity 插入数据库,尽管并非所有列都已映射,只要未映射的列可为空,即使有外键?

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

这是我迄今为止尝试过的:

尝试 1: 我开始沿着数据库模式创建单独的实体的道路,然后创建冗长的表达式以便能够从一种转换为另一种。

这可能最终奏效了,但忽略它所花费的可笑的时间,它产生了一个新问题;我的Expression<Func<MyEntity, bool>>显然,where 子句的表达式不能再应用于数据库,而是必须返回所有记录,编译表达式,并将其应用于结果可枚举。

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


尝试 2:

然后,我尝试创建继承类,其中可以包含解决方法属性,在其 setter 中设置实际属性,而实际属性则通过 Fluent API 被忽略。感谢继承,我前面提到的 where 表达式应该可以工作。

但是,继承被 EF 发现,并且我无法再查询数据库,因为架构与它似乎期望的实体的继承层次结构不匹配。 (我知道这有点模糊,但考虑一下 EF 的 TPH/TPT/etc 方面,以及这不一定符合我的架构 - 我认为这是我最接近的尝试,但我不知道如何通过以下方式纠正问题流畅的 API)。


尝试 3: 最后,我尝试与设计师进行修补。关于这一点没什么好说的,只是我不再与设计师进行修补。


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

抱歉文字墙 - 感谢您的帮助!

最佳答案

答案 1:不可以。EF 目前不支持将 char(1) 映射到 bool。您可以投票给my suggestion .

答案 2:是的,如果所有非映射列都可以为空或定义了默认值约束。

答案 3:NHibernate

关于c# - Entity Framework 、现有数据库、代码优先 - 忽略数据库列和更改数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11048247/

相关文章:

c# - C# 中有类似 Stackless Python 的东西吗?

c# - 存储库模式和多个相关的核心实体或业务对象——一个存储库还是多个?

c# - 如何从其父接口(interface)获取派生类的实际类型

mysql - 这两个 SQL 查询哪个更高效?

winforms - 如何将 Entity Framework 关联绑定(bind)到 ComboBox?

c# - 白鲸记的异常(exception)

c# - 根据索引获取数组项

c# - C# 中的通用值相等(标识)

c# - 使用children更新数据库条目

WCF 数据服务代理不想两次使用相同的命名空间