无法使用DatabaseGeneratedOption.Computed将值NULL插入到列中

时间:2014-11-28 10:00:30

标签: c# entity-framework-6

我正在使用EntityFramework,我尝试使用计算列

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
        public bool IsComplete
        {
            get
            {
                if (Steps == null) return false;
                var stepCount = Steps.Count;
                var completedCount = Steps.Count(s => s.IsComplete = true);
                return stepCount == completedCount;
            }
            private set { }
        }

但每当我尝试保存模型的新对象时 - 给我

Cannot insert the value NULL into column 'IsComplete'

我认为在保存模型的新对象时计算了一个计算列,并且不必包含任何数据。

有谁知道问题是什么?

1 个答案:

答案 0 :(得分:0)

DatabaseGeneratedOption.Computed意味着数据库本身应该处理此字段,并且实体框架不应该参与生成此字段,例如DateCreated字段的DEFAULT GETDATE() - 请参阅此处的计算'数据库生成一个值时插入或更新行。'

http://entityframework.codeplex.com/SourceControl/changeset/view/a5faddeca2be#src/EntityFramework/DataAnnotations/Schema/DatabaseGeneratedOption.cs

在我看来,您正在尝试基于实体数据(即CalculateIsComplete())来实现某些业务逻辑,这可能应该存在于您的实体之外。有几种方法可以做到这一点,也许你有一个服务或明显的层来在你的应用程序中实现这个业务逻辑,或者你可以使用扩展方法,例如:

        public static bool IsComplete(this MyClass obj)
        {
              if (obj.Steps == null) return false;
                var stepCount = obj.Steps.Count;
                var completedCount = obj.Steps.Count(s => s.IsComplete = true);
                return stepCount == completedCount;
        }