为什么我不能使用数据库集默认值?

时间:2013-04-08 20:30:30

标签: sql-server entity-framework

为什么我不能在Entity Framework中使用数据库集默认值?当我设计我的数据库时,我添加了适当的默认值(即“默认值或绑定”字段)。现在似乎我必须在我的代码中指定那些默认值,除非我使用StoreGeneratedPattern.Computed但是我不允许稍后更改该值。如果我没有在代码中指定默认值,则会出现异常。

1 个答案:

答案 0 :(得分:0)

这里有一些逻辑。

在你的实体中你有public int ExampleInt {get;组; }。假设您将“示例”列的默认值设置为100。

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

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

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

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不能这样做了。而且我也给了你(坏)的想法,你怎么能解决这个问题。