如何在Entity Framework中映射无主键且无法新增列的数据库表
解决EF映射无主键表的方案
遇到这种数据库表没主键、又没法新增列的情况确实头疼,不过EF有两种方案能应对,看你的业务需求来选:
方案一:用复合主键(支持增删改操作)
EF允许把多个列的组合设为主键,只要这些列的组合能唯一标识每条记录就行。你只需要给实体类里的每一列加上[Key]和Column(Order)属性来指定主键顺序:
[Table("MYTABLE")] public class MyTable { [Key] [Column(Order = 0)] [Column("NUMX")] public virtual string NumX { get; set; } [Key] [Column(Order = 1)] [Column("NAME")] public virtual string Name { get; set; } [Key] [Column(Order = 2)] [Column("AGE")] public virtual int Age { get; set; } }
注意事项
- 要确保
NUMX + NAME + AGE的组合在表中是唯一的,否则后续做更新、删除操作时,EF会找不到目标记录,甚至误操作多条数据。 - 属性名建议遵循C#规范,首字母大写(比如把
AGE改成Age),虽然不影响映射,但代码可读性更好。
方案二:无键实体(仅支持查询操作)
如果你的业务只需要从这个表读取数据,不需要做增删改,那用EF Core 3.0及以上版本支持的无键实体更省事。只需要给实体类加上[Keyless]属性,EF就不会强制要求主键了:
[Keyless] [Table("MYTABLE")] public class MyTable { [Column("NUMX")] public virtual string NumX { get; set; } [Column("NAME")] public virtual string Name { get; set; } [Column("AGE")] public virtual int Age { get; set; } }
限制说明
无键实体只能用于查询,不能执行Add、Update、Delete这类修改操作,因为EF没有主键来定位要操作的具体记录。
内容的提问来源于stack exchange,提问作者Thiago Pelissari
相关产品推荐
相关产品推荐

