我有下表:
create table tbl
(
id int identity(1,1),
val varchar(100)
)
现在,当我使用 Entity Framework 将对象映射到该表时,它可以工作,但是当我按如下方式更改表定义时:
create table tbl1
(
id int,
val varchar(100)
)
实体框架不会将对象映射到此表。任何关于为什么会发生这种情况的线索将不胜感激。
我有下表:
create table tbl
(
id int identity(1,1),
val varchar(100)
)
现在,当我使用 Entity Framework 将对象映射到该表时,它可以工作,但是当我按如下方式更改表定义时:
create table tbl1
(
id int,
val varchar(100)
)
实体框架不会将对象映射到此表。任何关于为什么会发生这种情况的线索将不胜感激。
实体框架需要主键才能从数据库生成模型。如果表上没有主键,它将简单地选择不可为空的列作为连接的主键,并且实体将是只读的。
在您的第一个表中,身份定义使您的 id 列不可为空,因此您可以创建一个实体。您应该在添加该表时看到此消息:
“表/视图 'tbl1' 没有定义主键。键已被推断出来,并且定义被创建为只读表/视图。”
但是,在您的第二个表中,没有不可为空的列,EF 无法为其创建实体。尝试添加时查看消息:
“表/视图 'tbl1' 没有定义主键,无法推断出有效的主键。此表/视图已被排除。要使用该实体,您需要查看您的架构,添加正确的键,并取消注释。”
实体框架通常需要一种方法来区分表中的两条记录,因此需要一个 ID/Key 鉴别器,它不需要是主键约束或唯一键约束或 DB 层的标识。但是这个鉴别器,一列或一组列,应该有助于实体框架唯一地识别一条记录并将其与其他记录区分开来。因此,您需要在 C# 层的实体类中定义这样的鉴别器。