0

为什么我不能在实体框架中使用数据库集默认值?当我设计我的数据库时,我添加了适当的默认值(即“默认值或绑定”字段)。现在看来,除非我使用,否则我无论如何都必须在我的代码中指定这些默认值,StoreGeneratedPattern.Computed但是以后不允许我更改该值。如果我没有在代码中指定默认值,我会得到一个异常。

4

1 回答 1

0

这里有一些逻辑。

在您的实体中,您有 public int ExampleInt { get; 放; }。假设您将 Example 列的默认值设置为 100。

想象一下创建实体对象的情况。它是一个 C# 对象,默认值由运行时填充。ExampleInt 初始化为值 0。此时,实体对象对 db 一无所知。然后您决定保存实体。EF 必须创建一行,然后插入您指定的值。可是等等?这应该是 0 还是 100?EF 必须跟踪您是否对该字段进行了更改,但如果您创建实体对象,EF 在您附加/保存它之前不会知道它。

只是一个想法:如果您在构造函数中运行查询以检查默认值怎么办?这将在您创建对象时使用默认值填充。如果对象是由 EF 创建的,则该值将被您在 db 中的内容覆盖。其实,我有一个更好的主意。

为什么不使用工厂来创建新的实体对象?工厂可以查询数据库的默认值吗?它仍然不是很好,但比在构造中运行查询要好得多。所以:

public class ExampleFactory
{
   public static GetExample ()
   {
       // obviously you want to run it only once. This is example only.
       int defaultValue = dbContext.Database.SQLQuery("SqlToGetTheDefaultValue");
       return new Example { ExampleInt = defaultValue };
   }
}

所以你去。现在你知道为什么 EF 不能这样做了。我还给了你(坏的)想法,你怎么能解决这个问题。

于 2013-04-09T19:49:46.070 回答