Подтвердить что ты не робот

Entity Framework с 1 по 1 с использованием кода. как?

У меня есть два класса. Как я могу превратить эти два класса в отношения "один к одному", используя первый метод кода сущности?

public class Region
{
  public int RegionId { get; set; }
  public string Name { get; set; }

  public virtual Factory _factory { get; set; }
}

public class Factory
{
  public int FactoryId { get; set; }
  public string Name { get; set; }

  public virtual Region _region { get; set; }
}

Когда я пытаюсь это сделать, я получаю эту ошибку: Множественность недействительна в роли "Region_Factory_Source" в отношении "Region_Factory". Поскольку свойства зависимой роли не являются ключевыми свойствами, верхняя граница множественности зависимой роли должна быть "*".

4b9b3361

Ответ 1

Это происходит в CodeFirst из-за ключевого слова virtual. Фактически, вы создаете отношения, в которых создание одного элемента требует создания другого. однако ключевое слово virtual позволяет использовать ленивое создание экземпляра, что означает, что создание объекта одного типа не создает автоматически другой тип, позволяя Идентификатору по постороннему элементу быть нулевым. Это подразумевает связь 0..1, но поскольку каждая сторона является виртуальной, то вы получаете 0..0, что недопустимо.

Есть два метода, которые вы можете использовать для исправления ситуации.

  • удалите виртуальную опцию с одной или с обеих сторон свойств навигации, используя карту 0..1 или 1..1.
  • явно добавить свойство для внешнего ключа из другого объекта для каждого объекта. т.е. на классе Region добавить свойство для FactoryId и на Factory добавить свойство для RegionId

Есть другие способы помочь Entity Framework определить, какой объект является зависимым объектом, то есть с использованием Entity Framework Fluent api.

из MSDN

Настройка отношения, в котором оба конца необходимы (один к одному)

В большинстве случаев Entity Framework может вывести, какой тип является зависимым и который является основным в отношениях. Однако, когда оба конца отношений требуются или обе стороны являются необязательными, Entity Framework не может идентифицировать зависимую и основную. Когда требуются оба конца отношения, используйте метод WithRequiredPrincipal или WithRequiredDependent после метода HasRequired. Если оба конца отношения являются необязательными, используйте метод WithOptionalPrincipal или WithOptionalDependent после метода HasOptional.

следующий код создаст Принципала Factory с зависимым Region

// Configure the primary key for the Region
modelBuilder.Entity<Region>()
    .HasKey(t => t.RegionId);

modelBuilder.Entity<Factory>()
    .HasRequired(t => t.Region)
    .WithRequiredPrincipal(t => t.Factory);

Ответ 2

EF6, добавьте атрибуты:

[Key]
public int RegionId { get; set; }

[Key, ForeignKey("Region")]
public int FactoryId { get; set; }