EF 4.1代码首先在插入父对象和子对象时遇到问题

时间:2011-08-04 13:54:38

标签: entity-framework entity-framework-4 ado.net entity-framework-4.1

我首先使用的是Ef 4.1代码。

我收到了以下错误并且不确定我做错了什么:

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

内部异常:

列名“GrantApplicationIs”无效。 列名称“GrantApplication_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 class GrantApplication
{
   public int Id { get; set; }
   public string EmployeeNumber { get; set; }
   public string Title { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public virtual ICollection<AuditEntry> AuditEntries { get; set; }
}

AuditEntry类:

public class AuditEntry
{
   public int Id { get; set; }
   public int OldValue { get; set; }
   public int NewValue { get; set; }
   public DateTime AuditDate { get; set; }
   public string EmployeeNumber { get; set; }
   public int GrantApplicationIs { get; set; }
   public GrantApplication GrantApplication { 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);
}

更新

我的表格结构如下:

GrantApplications表:

Id int
EmployeeNumber varchar(6)
Title varchar(10)
FirstName varchar(50)
LastName varchar(50)

AuditEntries表:

Id int
GrantApplicationId int
OldValue int
NewValue int
AuditDate datetime
EmployeeNumber varchar(6)

我不知道GrantApplicationIsGrantApplication_Id是什么以及为什么它们是列名。从什么?

1 个答案:

答案 0 :(得分:0)

对我来说,看起来这是问题的根源:

public int GrantApplicationIs { get; set; }
这是一个错字吗?不是GrantApplicationId吗?无论如何,效果是:

  • GrantApplicationIs未被识别为GrantApplication导航属性的外键属性。相反,它是一个普通的标量属性。如果您在数据库中没有这样的列,则会出现第一个例外情况:无效的列名'GrantApplicationIs'

  • EF使用FK数据库列的默认名称GrantApplication_Id。如果您在数据库中没有这样的列,则会出现第二个例外情况:无效的列名'GrantApplication_Id'

解决方案:

  • 根据约定(GrantApplicationId
  • 命名FK属性
  • 或者应用数据注释或Fluent API告诉EF GrantApplicationIs确实是您的FK属性(并在数据库中创建一个合适的列)。
相关问题