如何在没有主键实体框架的情况下映射表

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 或实体框架中创建没有主键的一对多关系?

如何在没有连接列的情况下映射一对一关系(实体通过它们的 ID 连接)?

如何让实体框架在不保存对象的情况下创建/更新数据库表