我很难过。我正在使用实体框架(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确实显示它们应该是键
修改
我创建了一个空的控制台应用程序并再次尝试使用相同的结果。 我有一个继承自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();
}
}
}
我实施上下文的方式可能有问题吗?
答案 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)