Как автоматически сопоставить свойство внешнего ключа с базой данных в EF6 - PullRequest
0 голосов
/ 14 апреля 2020

В моей базе данных есть две таблицы:

Сценарий :

Id
Name
Location_Id

Расположение :

Id
Name

Итак Сценарий имеет внешний ключ для Местоположение .

В коде у меня есть это:

Scenario.cs:

public int Id { get; set; }
public string Name { get; set; }
public int LocationId { get; set; }

Location.cs

public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Screen> Screens { get; set; } // I do not really need this...

Когда я использую его таким образом, я получаю исключение:

SqlException: Неверное имя столбца 'LocationId'

Но, когда я использую public virtual Location { get; set; } в моем Scenario классе, это, конечно, распознает взаимосвязь.

Мне хотелось бы, чтобы EF автоматически «отображал» LocationId на Location_Id. Я не хочу LocationId в моей базе данных, потому что другие внешние ключи используют подчеркивание: Entity_Id. Поэтому я не хочу настраивать каждый внешний ключ следующим образом:

modelBuilder.Entity<Scenario>().Property(s => s.LocationId).HasColumnName("Location_Id");

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Вы можете использовать Пользовательский код первых соглашений .

Вот соглашение, которое ищет свойства, заканчивающиеся на Id и по крайней мере один символ, предшествующий Id. Соглашение заменяет имена на <preceding part> + _ + Id.

using System.Data.Entity.Core.Metadata.Edm;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Text.RegularExpressions;
...
class ForeignKeyPropertyConvention : IStoreModelConvention<EdmProperty>
{
    public void Apply(EdmProperty property, DbModel model)
    {
        property.Name = Regex.Replace(property.Name, "^(.*.)(Id)$", @"$1_$2");
    }
}

Добавьте это соглашение к построителю модели в OnModelCreating:

modelBuilder.Conventions.Add(new ForeignKeyPropertyConvention());

Конечно , только для одного свойства внешнего ключа, которое является избыточным, но в больших проектах это был бы удобный способ сделать это.

Для только этого одного свойства было бы достаточно добавить эту строку:

modelBuilder.Entity<Scenario>().Property(s => s.LocationId)
    .HasColumnName("Location_Id");
1 голос
/ 14 апреля 2020

Используйте атрибут данных ForeignKey:

public int Id { get; set; }
public string Name { get; set; }
public Location Location { get; set; }
[ForeignKey("Location")]
public int LocationId { get; set; }

Используя свободный API, он будет выглядеть почти так же. Оставьте атрибут данных и включите этот код:

modelBuilder.Entity<Scenarios>()
    .HasOne<Location>(s => s.Location)
    .WithMany()
    .HasForeignKey(s => s.LocationId);
...