Entity framework EF 4.1在插入父对象和子对象时首先出现问题的代码

Entity framework EF 4.1在插入父对象和子对象时首先出现问题的代码,entity-framework,entity-framework-4,ado.net,entity-framework-4.1,Entity Framework,Entity Framework 4,Ado.net,Entity Framework 4.1,我首先使用EF4.1代码 我犯了以下错误,不确定我做错了什么: 保存未公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅InnerException。 内部异常: 列名“Grantapplications”无效。 列名“GrantApplication\u Id”无效。 我有一个拨款申请,当我把它保存到数据库时,我正试图给它添加一个审计条目 以下是我的背景

我首先使用EF4.1代码

我犯了以下错误,不确定我做错了什么:

保存未公开其关系的外键属性的实体时出错。EntityEntries属性将返回null,因为无法将单个实体标识为异常源。通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常。有关详细信息,请参阅InnerException。

内部异常:

列名“Grantapplications”无效。 列名“GrantApplication\u Id”无效。

我有一个拨款申请,当我把它保存到数据库时,我正试图给它添加一个审计条目

以下是我的背景:

public class HbfContext : DbContext
{
   public DbSet<Bank> Banks { get; set; }
   public DbSet<AccountType> AccountTypes { get; set; }
   public DbSet<GrantApplication> GrantApplications { get; set; }
   public DbSet<AuditEntry> AuditEntries { get; set; }
}
以下是我如何将新审核条目添加到新的拨款申请中:

public void Insert(GrantApplication grantApplication)
{
   DateTime currentDateTime = DateTime.Now;
   string submitterEmployeeNumber = "123456";

   grantApplication.SignatureDate = currentDateTime;
   grantApplication.SubmitterEmployeeNumber = submitterEmployeeNumber;

   // Add audit entry
   grantApplication.AuditEntries = new List<AuditEntry>();
   grantApplication.AuditEntries.Add(new AuditEntry
   {
      NewValue = grantApplication.GrantApplicationStateId,
      AuditDate = currentDateTime,
      EmployeeNumber = submitterEmployeeNumber
   });

   // Insert the new grant application
   grantApplicationRepository.Insert(grantApplication);
}
AuditEntries
表格:

Id int
EmployeeNumber varchar(6)
Title varchar(10)
FirstName varchar(50)
LastName varchar(50)
Id int
GrantApplicationId int
OldValue int
NewValue int
AuditDate datetime
EmployeeNumber varchar(6)

我不知道什么是
grantapplications
GrantApplication\u Id
以及它们为什么是列名。从什么角度来看?

对我来说,这似乎是问题的根源:

public int GrantApplicationIs { get; set; }
这是打字错误吗?它不应该是
GrantApplicationId
?无论如何,效果是:

  • grantapplications
    未被识别为
    GrantApplication
    导航属性的外键属性。相反,它是一个普通的标量属性。如果数据库中没有这样的列,则会出现第一个异常:无效的列名“grantapplications”

  • EF使用FK数据库列的默认名称,即
    GrantApplication\u Id
    。如果数据库中没有这样命名的列,则会出现第二个异常:无效的列名“GrantApplication\u Id”

解决方案:

  • 根据约定命名FK属性(
    GrantApplicationId
  • 或者应用数据注释或Fluent API告诉EF,
    GrantApplicationIs
    确实是您的FK属性(并在DB中创建适当的列)

这个
GrantApplicationIs
不应该是
GrantApplicationId
吗?我不知道GrantApplicationIs是什么,它来自哪里。我的GrantApplication表中甚至没有此名称的列。@Brendan不在您的表中。但是在您的
AuditEntry
类中,您有一个属性
GrantApplicationIs
@Brendan:您是如何获得这些实体类的?@Ladislav:很抱歉给您添了这么多麻烦。这是我的错别字。GrantApplicationIs应该是GrantApplicationId。@Brendan:是的,我原以为你们的桌子会像这样。问题是
AuditEntry
类中的属性名
GrantApplicationIs
与数据库中的列名
GrantApplicationId
不匹配。您说过您首先使用代码,所以您已经手工编写了类,对吗?您不能简单地将属性名称更改为
GrantApplicationId
?这将是修复这两个异常的最简单方法。很抱歉给您带来这么多麻烦。这是我的错别字。GrantApplicationIs应该是GrantApplicationId.Slauma-EF是否容忍数据库中FK字段名称的变化?例如:GrantApplicationId vs.GrantApplicationId vs.GrantApplication\u Id vs.GrantApplication\u Id?@MattSlay:有无下划线问题。我相信,小写字母或大写字母不会,这取决于数据库系统是否将列名视为区分大小写。例如,在SQL Server中,它们不区分大小写。
Id int
GrantApplicationId int
OldValue int
NewValue int
AuditDate datetime
EmployeeNumber varchar(6)
public int GrantApplicationIs { get; set; }