如何在没有主键实体框架的情况下映射表
Posted
技术标签:
【中文标题】如何在没有主键实体框架的情况下映射表【英文标题】:How to map table without primary key Entity Framework 【发布时间】:2018-09-22 22:28:47 【问题描述】:我正在使用 Entity Framework 来映射一些表,但除非我将某些列声明为主键,否则我不能这样做。
这里的问题是我的数据库中的表没有主键并且有数百万行。我无权创建新的Id
列。
[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;
Obs:如果我将[Key]
属性添加到像Age
这样的列,它可以工作,但返回错误的数据。
有什么方法可以省略主键吗?
【问题讨论】:
您可以从所有列中创建一个复合键。 请参考这些 SO 问题:***.com/questions/3996782/…,***.com/questions/15381233/… 任何“普通”数据表都应该有主键——为什么一开始就忽略它呢? EF 需要 唯一标识每一行的东西 - 主键的确切工作!所以不要试图找到“解决”这个问题的方法——相反,拥抱主键并将一个添加到你的表中! (即使它已经有数百万行)NUMX
是唯一的吗?
问题是你的数据模型还没有主键。
【参考方案1】:
与 SQL 不同,实体框架需要主键。
EF 使用主键来唯一标识行(例如当您使用.Find()
或执行更新操作时)。
事实上没有主键记得一个 SQL VIEW,你可以只读取数据。
如果任何列唯一标识某一行,则将其设置为主键(不能为 NULL),如果在 Sql 中它不是键。 否则,如果列的组合是唯一的,则使用这些列创建一个复合键。
请记住,在 99% 的情况下你应该有一个主键,当你没有主键时,你应该停下来想想它是否有意义。
【讨论】:
【参考方案2】:我发现了问题所在。 复合键 适合我: 例如: 在我的 Context 中,我定义了 一些键,不仅是一个,而是三个键:
public class MyContext : DbContext
protected override void OnModelCreating(DbModelBuilder modelBuilder)
**//Here is the secret**
modelBuilder.Entity<MyModel>().HasKey(x => new x.NumX, x.Name,x.Age);
【讨论】:
以上是关于如何在没有主键实体框架的情况下映射表的主要内容,如果未能解决你的问题,请参考以下文章
JAPANESE 如何在没有额外列或额外映射表的情况下拥有主键外键关系
如何在 SQL Server 或实体框架中创建没有主键的一对多关系?