【问题标题】:C# Entity Framework database first missing key violation EntitySet '' is based on type '' that has no keys definedC# Entity Framework 数据库首先缺少键冲突 EntitySet '' 基于类型 '' 没有定义键
【发布时间】:2018-06-15 09:14:14
【问题描述】:

我被这个难住了。我正在使用实体框架 (EF 6.1.3) 并生成了一个数据库优先模型(这是奇怪的部分,因为我所做的大部分谷歌搜索都有代码优先的结果)。

当我尝试查询数据库时,我收到以下错误:

在模型生成过程中检测到一个或多个验证错误:TCCIntegration.DataAccess.Ozone.Context.CORP_MASTER: : EntityType 'CORP_MASTER' has no key defined。定义此 EntityType 的键" "定义此 EntityType 的键。 CorpMaster: EntityType: EntitySet 'CorpMaster' 基于没有定义键的类型 'CORP_MASTER'。

但我可以看到在实际的 SQL 数据库中定义了一个主键,并且在 .EDMX 中,我可以看到主键包含在模型中。

加上它是数据库优先的问题,我无法向模型添加任何数据注释,因为它们是自动生成的。我有什么明显的遗漏吗? (我尝试从.EDMX 中删除表格并重新添加它们并刷新.EDMX

这是 SQL DDL(感谢 STLDevoper)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[CORP_MASTER](
[CORP_MASTER__ID] [varchar](255) NOT NULL,
[CORP_MAST_ACQUIRED] [varchar](2) NULL,
[CORP_MAST_YEAR_START] [int] NULL,CONSTRAINT [PK_CORP_MASTER] PRIMARY KEY 
CLUSTERED 
(
[CORP_MASTER__ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

编辑 [CodeName47] EDMX 确实表明它们应该是键

编辑

我创建了一个空的控制台应用程序,然后再次尝试,结果相同。 我有一个继承自 DbContext 的类

namespace ConsoleApp2
{
    public class OzoneLiveLite : DbContext
    {
        public DbSet<CORP_MASTER> CorpMaster { get; set; }      
    }
}

提供者类

namespace ConsoleApp2
{
    public class OzoneLiveLiteProvider 
    {
        private readonly OzoneLiveLite _ozoContext;
        public OzoneLiveLiteProvider() : this(new OzoneLiveLite())
       {
       }

       public OzoneLiveLiteProvider(OzoneLiveLite ozoneLiveLiteProvider)
        {
            _ozoContext = ozoneLiveLiteProvider;
        }

        public void GetProjectFinancials()
        {
            var corpMaster = _ozoContext.CorpMaster;
            var ozoneFinancials = from corpMast in corpMaster select corpMast.CORP_MASTER__ID;
       }
        public void Dispose()
        {
            _ozoContext?.Dispose();
        }
    }
}

最后是主类

namespace ConsoleApp2
{
    class Program
   {
        static void Main(string[] args)
       {
            var ozoneProvider = new OzoneLiveLiteProvider();
            ozoneProvider.GetProjectFinancials();
            Console.ReadKey();
       }
   }
}

我实现上下文的方式可能有问题吗?

【问题讨论】:

  • 请提供CORP_MASTER表的SQL DDL,包括主键的定义。
  • 道歉 - SQL 数据定义语言 - 用于创建 CORP_MASTER 表的 CREATE TABLE 语句。
  • 您应该将 CORP_MASTER 表的 DDL 添加到您的问题中,而不是在评论中发布。
  • 了解您正在使用的 EF 版本可能也很好。
  • 这个主意不错,我试试看,谢谢

标签: c# entity-framework-6 ef-database-first


【解决方案1】:

这正是归结于我的一点无知和一大堆愚蠢。在我的上下文类中,我继承自 DbContext() 而不是自动生成的部分实体类。

所以我的上下文看起来像

 public class OzoneLiveLite : DbContext
{
    public DbSet<CORP_MASTER> CorpMaster { get; set; }
    public DbSet<JCS_FINYEAR> JcsFinyear { get; set; }
    public DbSet<JCS_JOB> JcsJob { get; set; }
    public DbSet<JCS_JOB__JCS_JOB_SUBJOB> JcsJobJcsJobSubjob { get; set; }
    public DbSet<JCS_FINYEAR__JCFY_PERIOD> JcsFinyearJcfyPeriod { get; set; }
}

代替

 public class OzoneLiveLite : Ozone_Live_LiteEntities
{
    public DbSet<CORP_MASTER> CorpMaster { get; set; }
    public DbSet<JCS_FINYEAR> JcsFinyear { get; set; }
    public DbSet<JCS_JOB> JcsJob { get; set; }
    public DbSet<JCS_JOB__JCS_JOB_SUBJOB> JcsJobJcsJobSubjob { get; set; }
    public DbSet<JCS_FINYEAR__JCFY_PERIOD> JcsFinyearJcfyPeriod { get; set; }
}

说实话,我仍然不确定为什么它允许我构建并且只在运行时失败,但看起来我的问题目前已经解决了。

谢谢大家的帮助

【讨论】:

    【解决方案2】:

    原因

    如果您没有标准主键名称和非整数主键,则 ef 可能无法识别您的主键。

    您可以通过以下步骤将该列设为主键

    1. 进入设计器,选择列
    2. 单击属性。
    3. 将 EntityKey 属性设置为 true

    列的属性部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多