如何使用entity framework中的DataBase中的默认列值?
我有一个表中的date列有默认值或绑定为getutcdate()。 我想在entity framework中使用这个。在生成EDM时,我能够在列级别find“默认值”属性,但是我认为这是硬编码值。
请让我知道如何使用数据库中指定的默认值。
为实体实现OnCreated事件是我find的解决scheme。 我有一个Guid财产,我想填充。 默认情况下,它被全部填充(00000-0000-00000等)。 通过将以下内容添加到实体的部分类中,我能够处理该问题。
partial void OnCreated() { Guid = Guid.NewGuid(); }
StoreGeneratedPattern =“Computed”与默认值不一样,因为这个属性会在数据库中以默认值EVERY TIME更新。意思是不可能手动更新它。
您可以将StoreGeneratedPattern设置为Identity,在这种情况下,EF在执行INSERT语句后读取数据库返回的值。 这种方法的问题是,下一次生成XML映射时,您的更改将会丢失。
另一种方法是将代码中的值自己设置为DateTime.UtcNow。 您可以在实体的构造函数中设置它(如果需要,可以定义一个新的构造函数),也可以在您自己的事件处理函数中为您的上下文的SavingChanges事件设置它(有关示例,请参阅如何执行业务逻辑保存更改(entity framework)处理SavingChanges事件)。
设置StoreGeneratedPattern =“Computed”或“Identity”的问题是,它们不允许客户端提供值。 碰到这个插入问题,但也更新。
看起来像StoreGeneratedPattern需要另外一个或两个选项,这样数据库至less可以看到用户提供的值,但是如果需要的话可以覆盖它。 这将允许任何现有的数据库插入或更新触发器基于另一个字段更新一个字段的工作。 例如,一个更新的数据库触发器可能会更新修改后的时间戳,只有在没有提供修改时间戳的情况下,只有在某些字段被更新的情况下。
也许SQL Server中的列扩展属性function可以用来在提取过程中自动设置这个字段,所以我们不会最终编辑XML文件。
在这篇文章中还有另外一个解决scheme,在构造函数中使用一个部分类和一个方法来设置值。
如何使用默认entity framework和默认date值
我发现这很简单,就是为实体模型创build一个类似于数据注解的部分类。 然后我重写默认的构造函数,并在构造函数中设置默认属性。 奇迹般有效。
public partial class CallHistoryLog { public CallHistoryLog() { this.NumberFromId = -1L; this.NumberFromName = "NO NAME"; this.NumberToId = -1L; this.NumberToName = "NO NAME"; this.RouteId = -1L; this.Viewed = false; this.Deleted = false; this.DateCreated = DateTime.Now; } }
这是一个可能的,但不是漂亮的解决方法 –
在列上设置计算将使其只读,但会使默认值工作。 有可能有一个真正的计算列,比如说“LastChangedAt_computed”,显示“LastChangedAt_default”或“LastChangedAt_manual”的值。
现在,计算列显示了默认列的值,除非手动列不为空,在这种情况下显示。 在模型中,默认列的StoragePattern需要被“计算”。
这是一个丑陋的解决scheme,但它应该工作。
嗯…如果你使用EF6,这实际上比你想象的要容易得多。 只需打开你的模型,右键点击你想设置的默认列,select属性,你会看到一个“DefaultValue”字段。 只需填写并保存。 它会为你设置代码。
一些其他的解决scheme的问题是,虽然他们可能最初工作,只要你重build模型,它会抛出你插入到机器生成的文件的任何自定义代码。
所以引擎盖下UI的工作原理是向edmx文件添加一个额外的属性:
<EntityType Name="Thingy"> <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />
并通过添加必要的代码给构造函数:
public Thingy() { this.Iteration = 1;