我的表包含一个标识列,一个已创建的列和一个按列创建的文件。
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)>
属性添加到CREATED
和CREATED_BY
属性,请运行代码,I得到以下错误:
当IDENTITY_INSERT设置为OFF时,无法在表'T_CA_EMPLOYEE'中为identity列插入显式值。
如果我将<DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)>
注释添加到ID列,一切似乎都有效。
两个问题:
我是否为这三个属性使用了正确的DatabaseGeneratedAttribute
标签?
由于ID
遵循身份/主键的命名约定,我认为<DatabaseGenerated(DatabaseGeneratedOption.Identity)>
是不必要的。如果我省略注释,为什么会出现错误?
提前感谢您的帮助。
答案 0 :(得分:1)
1)我是否为三个属性使用了正确的DatabaseGeneratedAttribute标记?
正确。 DatabaseGeneratedOption.Identity
是告诉EF在插入新记录时数据库生成列值的唯一方法。
2)由于ID遵循身份/主键的命名约定,我认为是不必要的。如果我省略注释,为什么会出现错误?
通常,EF约定意味着整数类型PK的标识。同时它假定(可能是错误的)表只定义了一个标识列,因此当您将其他列明确标记为标识时,不应用默认约定,并且您应该明确标记其他标识列,包括PK。