Squeak.ru - шаблоны программирования

Запись вставляется в дочерний элемент при обновлении родителя

С приведенным ниже кодом, когда я обновляю объект Employee, в таблицу Language добавляется новая запись, и я не понимаю, почему. LanguageId имеет значение, и я установил Language (см. информацию в коде). Запись Employee обновляется как LanguageId вновь созданной.

Что я делаю неправильно?

public class Employee
{
    public virtual int EmployeeId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }

    public virtual int LanguageId { get; set; }
    public virtual Language Language { get; set; }
}

public class Language
{
    public virtual int LanguageId { get; set; }
    public virtual string Name { get; set; }
    public virtual string Code { get; set; }
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Employee>()
    .HasRequired(t => t.Language); 
}

private void Update(Employee employee)
{
    //LanguageId in employee object has a value, OK
    //Language is null
    employee.Login = employee.Login.ToUpper();
    employee.Language = myRepository.Get(employee.LanguageId);

    myRepository.Update(employee);
}

Ответы:


1

Есть несколько советов, которыми я хочу поделиться с вами. Если вы хотите настроить отношение один к одному с помощью FK, Entity Framework требует, чтобы первичный ключ зависимого конца также был внешним ключом, но я думаю, что это не ваш случай, потому что один Language может быть связан с более чем одним Employee, поэтому вам нужно настроить отношение "один ко многим". Конфигурация ваших отношений будет такой:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Employee>().HasRequired(t => t.Language).
                                   WithMany().HasForeignKey(e=> e.LanguageId);
}

Если вы хотите обновить Language в Employee, у вас есть два варианта:

  • Установка свойства FK LanguageId
  • Настройка свойства навигацииLanguage.

Если вы уже установили LanguageId с идентификатором Language, который уже существует в БД, вам не нужно находить этот Language и устанавливать свойство Language в вашем экземпляре Employee. Для EF достаточно установить свойство FK, чтобы внести изменения.

10.02.2015

2

У вас неправильный код.

public class Employee
{
    public int EmployeeId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public int LanguageId { get; set; }
    [ForeignKey("LanguageId")]
    public virtual Language Language { get; set; }
}
public class Language
{
    public int LanguageId { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
}

Если emplyee.LanguageId имеет значение, то EF автоматически привязывает объект Language.

Если вы хотите сохранить Employee без языкового свойства, вы должны сделать его необязательным в OnModelCreating и в классе Employee:

public int? LanguageId {get; set;}
10.02.2015
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...