EF автоматически генерирует поле внешнего ключа при выполнении транзакции базы данных, которая не существует - PullRequest
0 голосов
/ 23 июня 2019

Я работаю над одним проектом, в котором мы используем структуру сущностей для транзакций базы данных.При выполнении транзакции базы данных, если в какой-либо таблице есть какой-либо ссылочный ключ, он автоматически создает новое поле для этой ссылочной сущности, которая даже не существует.

Например:

Iодна таблица называется Stations , которая имеет ссылку на StationTypes (один-к-одному).

Теперь всякий раз, когда мы пытаемся создать / обновить любую запись в StationsВ таблице, по умолчанию, вводится одно поле с именем «StationType_Id» в конкретный запрос с именем «StationType_Id», который даже не существует, и в итоге выдает ошибку сгенерированного ниже.

Invalid column name 'StationTypes_Id'.

Образец объекта БД, сгенерированныйEF

public partial class Stations
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Stations()
    {
        this.OrganizationStations = new HashSet<OrganizationStations>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int StationTypeId { get; set; }
    public int Status { get; set; }
    public int CreatedBy { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public Nullable<int> UpdatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedDate { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<OrganizationStations> OrganizationStations { get; set; }
    public virtual StationTypes StationTypes { get; set; }
}

1 Ответ

0 голосов
/ 24 июня 2019

Похоже, что на самом деле это были бы отношения Много-к-1. Станция имеет 1 тип станции, но многие станции могут иметь один и тот же тип станции.

В этом случае можно ожидать, что запись Station будет иметь столбец StationTypeId. Скорее всего, вы не захотите выставлять свойство StationTypeId в вашей сущности Station, чтобы отобразить это в EF 6:

с использованием modelBuilder

modelBuilder.Entity<Station>
   .HasRequired(x => x.StationType)
   .WithMany()
   .Map(x => x.MapKey("StationTypeId"));

Отношение 1 к 1 будет иметь таблицу StationType, совместно использующую PK StationId с таблицей Station. В этом случае Station будет иметь ссылку на StationType, а StationType будет иметь ссылку на Station. EF связывает их вместе с помощью PK:

modelBuilder.Entity<Station>
   .HasRequired(x => x.StationType)
   .WithRequired(x => x.Station);

Это может быть установлено с отношением FK к FK, но один FK должен иметь нулевое значение.

...