C#Entity Framework数据库首次缺少密钥违规EntitySet''基于类型''没有定义密钥

时间:2018-06-13 23:32:55

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

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

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

  

在模型生成期间检测到一个或多个验证错误:TCCIntegration.DataAccess.Ozone.Context.CORP_MASTER :: EntityType'CORP_MASTER'没有定义键。定义此EntityType的键“”定义此EntityType的键。 CorpMaster:EntityType:EntitySet'CorpMaster'基于类型'CORP_MASTER',没有定义键。

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

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

这是SQL DDL(感谢STLDeveloper)

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

EDIT [CodeName47] EDMX确实显示它们应该是键

Table Mapping Design and Properties

修改

我创建了一个空的控制台应用程序并再次尝试使用相同的结果。 我有一个继承自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();
        }
    }
}

最后是Main class

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

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

2 个答案:

答案 0 :(得分:1)

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

所以我的上下文看起来像

library(tidyverse);
df[complete.cases(df), ] %>%
    gather(key, value, -AGI) %>%
    group_by(AGI) %>%
    summarise(value.mean = mean(value))
## A tibble: 3 x 2
#  AGI   value.mean
#  <chr>      <dbl>
#1 h          0.523
#2 i          0.414
#3 j          0.537

而不是

 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; }
}

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

谢谢大家的帮助

答案 1 :(得分:0)

<强>原因

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

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

  1. 转到设计师并选择列
  2. 点击属性。
  3. 将EntityKey属性设置为true
  4. 列的属性部分

    enter image description here