В коде EF 4.1 возникли проблемы при вставке родительских и дочерних объектов - PullRequest
0 голосов
/ 04 августа 2011

Сначала я использую код 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);
}

UPDATE:

Структура моей таблицы выглядит следующим образом:

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)

Понятия не имею, что GrantApplicationIs и GrantApplication_Id и почему они являются именами столбцов. С чего?

1 Ответ

0 голосов
/ 04 августа 2011

Мне кажется, что это источник проблемы:

public int GrantApplicationIs { get; set; }

Это опечатка? Разве это не должно быть GrantApplicationId? В любом случае эффект:

  • GrantApplicationIs не распознается как свойство внешнего ключа для свойства навигации GrantApplication. Вместо этого это обычное скалярное свойство. Если у вас нет столбца с таким именем в БД, вы получите свое первое исключение: Неверное имя столбца 'GrantApplicationIs' .

  • EF использует имя по умолчанию для столбца базы данных FK, которое равно GrantApplication_Id. Если у вас нет столбца с таким именем в БД, вы получите второе исключение: Неверное имя столбца 'GrantApplication_Id' .

Решение:

  • Либо назовите свойство FK в соответствии с соглашениями (GrantApplicationId)
  • Или примените аннотации данных или Fluent API, чтобы сообщить EF, что GrantApplicationIs действительно является вашим свойством FK (и создать соответствующий столбец в БД).
...