实体框架DatabaseGeneratedOption SQL Server GETDATE

时间:2017-07-30 15:50:30

标签: sql-server entity-framework

我的表包含一个标识列,一个已创建的列和一个按列创建的文件。

CREATE TABLE dbo.T_CA_EMPLOYEE 
(
    ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
    FIRST_NAME VARCHAR(50),
    LAST_NAME VARCHAR(50),
    CREATED DATETIME NOT NULL DEFAULT GETDATE(),
    CREATED_BY VARCHAR(30) NOT NULL DEFAULT CURRENT_USER
); GO

类定义(由代码优先于现有数据库生成):

Public Class T_CA_EMPLOYEE

    Public Property ID As Integer

    <StringLength(50)>
    Public Property FIRST_NAME As String

    <StringLength(50)>
    Public Property LAST_NAME As String

    Public Property CREATED As Date

    <Required>
    <StringLength(30)>
    Public Property CREATED_BY As String

End Class

代码:

Using ctx As New Model1
    Dim newEmployee As T_CA_EMPLOYEE = New T_CA_EMPLOYEE
    newEmployee.LAST_NAME = "New Employee"
    ctx.T_CA_EMPLOYEE.Add(newEmployee)
    ctx.SaveChanges()
    logger.DebugFormat("Created new employee {0}", newEmployee.ToString)
End Using

我不清楚如何注释域对象属性。

当我运行上面的代码时,我得到以下

  

EntityValidationError:CREATED_BY:CREATED_BY字段是必需的

如果我从<Required>属性中删除CREATED_BY属性,并将<DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)>属性添加到CREATEDCREATED_BY属性,请运行代码,I得到以下错误:

  

当IDENTITY_INSERT设置为OFF时,无法在表'T_CA_EMPLOYEE'中为identity列插入显式值。

如果我将<DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)>注释添加到ID列,一切似乎都有效。

两个问题:

  1. 我是否为这三个属性使用了正确的DatabaseGeneratedAttribute标签?

  2. 由于ID遵循身份/主键的命名约定,我认为<DatabaseGenerated(DatabaseGeneratedOption.Identity)>是不必要的。如果我省略注释,为什么会出现错误?

  3. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  

1)我是否为三个属性使用了正确的DatabaseGeneratedAttribute标记?

正确。 DatabaseGeneratedOption.Identity是告诉EF在插入新记录时数据库生成列值的唯一方法。

  

2)由于ID遵循身份/主键的命名约定,我认为是不必要的。如果我省略注释,为什么会出现错误?

通常,EF约定意味着整数类型PK的标识。同时它假定(可能是错误的)表只定义了一个标识列,因此当您将其他列明确标记为标识时,不应用默认约定,并且您应该明确标记其他标识列,包括PK。