实体框架:忽略列

时间:2009-04-10 12:46:03

标签: entity-framework

我有一个数据库,我希望从中构建一个EF模型,但我不想在数据库中包含某些列,因为相关列只在服务器上维护,不应由任何应用程序操作。

两个列都是DateTime(如果这有任何区别),其中一列可以为空,并且由更新时的触发器维护,另一列不可为空,并使用表定义中的默认值进行设置。

我想我正在寻找像Linq2Sql中的“Server Generated”选项;但我找不到这样的选择。

有人可以告诉我如何解决这个问题吗?

警告:

我一直在尝试在我的工作地点引入业务对象建模多年,并且由于必须手动操作额外代码的数量,它一直被拒绝。由于设计人员和代码生成,EF目前被视为一种可行的解决方案,因此任何涉及手动操作XML的选项都只会让我的其他同事远离EF。因此,我正在寻找可以使用设计师或使用代码完成的事情。

修改

我想我在这里寻找的是......

(a)创建模型的方法,不使用EF引用商店中的列(ssdl),因此不希望以任何方式操纵它 (b)在创建ObjectContext时以编程方式对属性进行编程设置“StoreGeneratedPattern”的方法(简单的答案是在.ssdl中手动操作它,但如果我从数据库中刷新模型,那么这将被覆盖我无法沿着.csdl,.msl& .ssdl手动操作的路线走下去。

7 个答案:

答案 0 :(得分:28)

您可以使用实体框架执行此操作吗?是;这很简单。你能用Entity Framework设计师做到这一点吗?不幸的是,这要困难得多。

您遇到的问题是该列存在于EDMX的存储架构(SSDL)中。使用GUI设计器删除列只是将其从客户端模式中删除,而不是映射或存储模式。但是,进入EDMX并删除它很简单。完成后,您还可以将其从EDMX的客户端架构部分中的映射中删除,实体框架将更长时间抱怨它未映射。

问题解决了,对吧?

嗯,不。使用GUI设计器从数据库更新EDMX时,将丢弃并重新生成存储架构。所以你的专栏会回来。据我所知,没有办法告诉GUI设计师永远不会映射特定的列。因此,每次使用GUI设计器进行更新时都必须重新执行此操作。幸运的是,EDMX是XML,因此您可以使用XML转换,LINQ或您选择的XML工具来完成此任务。

答案 1 :(得分:2)

您是否可以使用所需的列创建视图,并通过实体功能向导将其导入并将其映射到您的实体?

答案 2 :(得分:1)

您是否希望该列完全出现在模型中?

尝试在Designer视图中选择列并点击删除键。

修改

您可以将属性的setter设为私有。然后您的应用将无法修改该值。

答案 3 :(得分:0)

右键单击图形表示中的字段,然后选择删除。我发现,有时当您对建模进行大量更改并开始失去对更改的跟踪时,您会收到错误。您最好的选择可能是重建EF生成的模型。

请记住,当您“从数据库更新”时,生成的模型上的旧字段将不会被删除,您必须手动删除它们。例如,如果在数据库中将DateField1重命名为DateField2,然后“从数据库更新模型”,则现在将在结果模型上看到DateField1和DateField2。这可能是错误的原因。

答案 4 :(得分:0)

时间戳是与DateTime不同的数据类型。时间戳似乎被识别为引擎管理的属性,非常类似于身份属性。您无法“更新”时间戳属性。因此,EDM可以正确地管理它(正如它的身份一样)。

答案 5 :(得分:0)

您可以修改文本模板,以在生成实体类时忽略这些列。例如,如果您添加了" IGNORE"在文档摘要中,您可以通过替换来修改模板以忽略它们;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity)

用;

Dim simpleProperties as IEnumerable(Of EdmProperty) = typeMapper.GetSimpleProperties(entity).Where(Function(p) p.Documentation is nothing orelse p.Documentation.Summary.IndexOf("IGNORE")<0)

答案 6 :(得分:0)

在 EDMX 设计器中,选择属性并将 StoreGeneratedPattern 设置为 Computed。