我试图了解Entity Framework中两个DatabaseGeneratedOption
的(功能)差异(代码优先):
DatabaseGeneratedOption.Identity
DatebaseGeneratedOption.Computed
我已经读过documentation,但是我不了解两者之间的功能差异。
选项 Identity 被描述为数据库在插入一行时生成一个值。但是,如果稍后尝试出现异常提示说我无法使用身份模式修改列,则无法更新该值。
选项已计算描述为插入或更新行时数据库会生成一个值。但是,这只是您告诉Entity Framework的内容,到目前为止,如果没有SQL触发器,我将无法实现这一目标。如果我尝试更新该值,则什么也不会发生(Entity Framework拒绝覆盖现有值)。
所以我剩下的是两个功能相同的选项。我可以在SQL表中有一个默认值,该默认值将应用于插入。而且我以后无法更新此值(使用实体框架)。那么,如何使用它们的不同之处在哪里?
答案 0 :(得分:1)
computed column包含一个值,该值是在请求记录时计算得出的(因此称为名称)。
计算列可以由其他列值,常量和函数返回值组成。
例如,您可以为发票到期日期创建一个计算列:
CREATE TABLE Invoice
(
InvoiceDate DATETIME NOT NULL,
ExpiryDate AS DATEADD(DAY, 30, InvoiceDate)
)
现在,如果您将此列标记为在Entity Framework中计算,则它将拒绝对该列进行任何更新,因为它将知道数据库将不支持该更新。
因此该属性的文档不正确或不完整。
标记为Identity的列在插入记录时将使用特定于数据库的语法为给定表生成主键,在MSSQL中为IDENTITY()
,对于MySQL为AUTO_INCREMENT
。计算列将简单地标记为只读,并且您必须提供自己的实现(在数据库中或在迁移文件中)以指定计算(请参见How to add computed column using migrations in code first?)。