我有一个最近从 VS2010 迁移到 VS2012 的项目。
它包含一个包含我的实体的 EF4.1 edmx 文件。其中一些实体基于视图并且是只读的。虽然视图返回的某些列可以为空,但我在视图中更改了这些列的返回值,以确保它们不会返回 null 使用
ISNULL(NumericColumnName, 0) AS NumericValueColumn
通过 VS2010 中的“从数据库更新模型”功能更新模型时,以这种方式返回的列在我的模型中被创建为不可为空。但是,自从迁移到 VS2012 后,情况就不再如此了。
现在,每当我使用“从数据库更新模型”功能时,这些属性都会生成为可为空的。我要做的是手动将列设置为不可为空。但是,下次我运行“从数据库更新模型”时,实体属性将重新生成为可为空。然后我必须再次将它们更新为不可为空。
我尝试过的另一种解决方法是将基于视图的实体移动到它们自己的 edmx 文件中。但是,在更新任一 edmx 文件时,我看到了相同的行为。
另一个细节是我正在使用通过 EF4.1 T4 STE 模板生成的自我跟踪实体。
有什么方法可以防止 VS2012 的 EF 设计器覆盖我的基于视图的实体的不可空属性?
编辑
事实证明,VS2012 中的设计器试图阻止您朝自己的脚开枪,并因此更改了我的实体中的成员属性。
从以下内容生成成员时:
SELECT ISNULL(Quantity,0) * ISNULL(Number, 0) AS Total FROM SomeTable
VS2012 将始终将 SomeTable 实体上的成员 Total 设置为可为空,因为它不明白乘法的结果不可能为 0。为了防止这种行为,请将其更改为:
SELECT ISNULL(Quantity * Number, 0) AS Total FROM SomeTable.
注意聚合,因为ISNULL(SUM(SomeCol),0)
它与SUM(ISNULL(SomeCol,0))
.