C# C实体框架数据库第一个缺少密钥冲突EntitySet“”基于未定义密钥的类型“”

C# C实体框架数据库第一个缺少密钥冲突EntitySet“”基于未定义密钥的类型“”,c#,entity-framework-6,ef-database-first,C#,Entity Framework 6,Ef Database First,我被这个难住了。我使用实体框架EF 6.1.3并生成了一个数据库优先模型这是一个奇怪的部分,因为我所做的大多数谷歌搜索都有代码优先的结果 当我试图查询数据库时,出现以下错误: 在模型生成过程中检测到一个或多个验证错误:tccsintegration.DataAccess.Ozone.Context.CORP_MASTER::EntityType“CORP_MASTER”未定义密钥。定义此EntityType的键定义此EntityType的键。CorpMaster:EntityType:Entit

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

当我试图查询数据库时,出现以下错误:

在模型生成过程中检测到一个或多个验证错误:tccsintegration.DataAccess.Ozone.Context.CORP_MASTER::EntityType“CORP_MASTER”未定义密钥。定义此EntityType的键定义此EntityType的键。CorpMaster:EntityType:EntitySet“CorpMaster”基于未定义键的类型“CORP_MASTER”

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

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

下面是SQL DDL开发人员

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
{
    class Program
   {
        static void Main(string[] args)
       {
            var ozoneProvider = new OzoneLiveLiteProvider();
            ozoneProvider.GetProjectFinancials();
            Console.ReadKey();
       }
   }
}
我实现上下文的方式可能有问题吗?

原因

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

您可以通过以下步骤使列成为主键

转到设计器并选择该列 单击属性。 将EntityKey属性设置为true 列的属性部分


这就是问题的症结所在,我有点无知,也有点愚蠢。在我的上下文类上,我是从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; }
}
老实说,我仍然不知道为什么它允许我构建,只是在运行时失败了,但看起来我的问题暂时解决了


感谢大家的帮助

请提供CORP_主表的SQL DDL,包括主键的定义。抱歉-SQL数据定义语言-用于创建CORP_主表的CREATE table语句。您应该将CORP_主表的DDL添加到问题中,而不是在评论中发布。了解您使用的EF版本可能也很好。这是一个非常好的主意,我会尝试一下,谢谢
 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; }
}