【问题标题】: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 这样的列,它可以工作,但返回错误的数据。

有什么方法可以省略主键吗?

【问题讨论】:

  • 您可以从所有列中创建一个复合键。
  • 任何“普通”数据表都应该有主键——为什么一开始就忽略它呢? EF 需要 唯一标识每一行的东西 - 主键的确切工作!所以不要试图找到“解决”这个问题的方法——相反,拥抱主键并将一个添加到你的表中! (即使它已经有数百万行)
  • NUMX 是唯一的吗?
  • 问题是你的数据模型还没有主键。

标签: asp.net-mvc entity-framework db-first


【解决方案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});
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-08
      • 2011-04-29
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2016-05-10
      • 1970-01-01
      相关资源
      最近更新 更多