DatabaseGeneratedOption:身份与计算

时间:2018-06-22 12:23:02

标签: c# sql-server entity-framework

我试图了解Entity Framework中两个DatabaseGeneratedOption的(功能)差异(代码优先):

  • DatabaseGeneratedOption.Identity
  • DatebaseGeneratedOption.Computed

我已经读过documentation,但是我不了解两者之间的功能差异。

选项 Identity 被描述为数据库在插入一行时生成一个值。但是,如果稍后尝试出现异常提示说我无法使用身份模式修改列,则无法更新该值。

选项已计算描述为插入或更新行时数据库会生成一个值。但是,这只是您告诉Entity Framework的内容,到目前为止,如果没有SQL触发器,我将无法实现这一目标。如果我尝试更新该值,则什么也不会发生(Entity Framework拒绝覆盖现有值)。

所以我剩下的是两个功能相同的选项。我可以在SQL表中有一个默认值,该默认值将应用于插入。而且我以后无法更新此值(使用实体框架)。那么,如何使用它们的不同之处在哪里?

1 个答案:

答案 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?)。