Если у меня есть следующая модель:

[Table("Person")]
public class PersonDao
{
    public Guid Id { get; set; }
    public ICollection<Address> { get; set; }
    // other properties
}

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }
    public PersonDao Person { get; set; }
    // other properties
}

Entity Framework правильно использует Person и Address для имен таблиц, но внешний ключ в Address называется PersonDao_Id. Я хочу, чтобы это было Person_Id.

Это ошибка или я должен написать собственное соглашение для имен свойств?

ПРИМЕЧАНИЕ. Я использую MySQL с Entity Framework, я не знаю, имеет ли это значение.

РЕДАКТИРОВАТЬ: Я знаю, что могу указать имя столбца вручную с помощью атрибута ForeignKey или свободного API. Мне нужно, чтобы это работало автоматически и глобально.

0
Botond Balázs 27 Дек 2016 в 17:37
stackoverflow .com / questions / 11148662 /… может оказаться полезным
 – 
Vladimir
27 Дек 2016 в 17:41
[ForeignKey ("Person_Id")] и подробности здесь: stackoverflow.com/questions/5082991/…
 – 
Mehmet
27 Дек 2016 в 17:41

2 ответа

Используйте атрибуты так же, как и вы, чтобы иметь разные имена для таблицы и класса:

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }

    [ForeignKey("Person_Id")] 
    public PersonDao Person { get; set; }
    // other properties
}

Если вы не хотите использовать соглашение по умолчанию, вы можете просто удалить Dao из имен ваших классов:

public class Person
{
    public Guid Id { get; set; }
    public ICollection<Address> { get; set; }
    // other properties
}

public class Address
{
    public Guid Id { get; set; }
    public Person Person { get; set; }
    // other properties
}
2
D Stanley 27 Дек 2016 в 18:14
Извините, но мой вопрос не совсем ясен. Я уже знаю об этом. Мне нужно, чтобы это работало автоматически и глобально.
 – 
Botond Balázs
27 Дек 2016 в 17:57
Итак, вы согласны с использованием атрибутов для указания имени таблицы, но не имени столбца? Почему бы просто не назвать свои классы без "Dao"? Чтобы ответить на вопрос, я не знаю способа глобально переопределить соглашение по умолчанию.
 – 
D Stanley
27 Дек 2016 в 18:13
Мне нравится называть свои классы доступа к данным Dao, чтобы отличать их от классов домена (структура которых не может быть напрямую отображена с помощью EF).
 – 
Botond Balázs
27 Дек 2016 в 18:17
Разница в том, что я думаю, что имена внешних ключей должны содержать имя таблицы (либо сгенерированное из имени класса, явно указанного с помощью атрибута, либо свободного API) вместо имени класса по умолчанию . Мне не нужно указывать их явно. Я действительно думаю, что это небольшая ошибка в EF, но я не уверен.
 – 
Botond Balázs
27 Дек 2016 в 18:19

Если вы хотите создать собственное имя столбца в базе данных, вы можете использовать Fluent API в методе protected override void OnModelCreating(DbModelBuilder modelBuilder) в контексте вашей базы данных. Добавьте к своим свойствам класса DAO имя столбца.

[Table("Person")]
public class PersonDao
{
    public Guid Id { get; set; }
    public ICollection<Address> Addresses { get; set; }
    // other properties
}

[Table("Address")]
public class AddressDao
{
    public Guid Id { get; set; }
    public Guid MyPersonDaoColumnName { get; set; }
    public PersonDao Person { get; set; }
    // other properties
}

А затем в Fluent API напишите:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<AddressDao>().HasRequired(x => x.Person)
                                     .WithMany(x => x.Addresses)
                                     .HasForeignKey(x => x.MyPersonDaoColumnName);
}

Но некрасиво смешивать Fluent API с атрибутом, поэтому вам также понадобятся:

modelBuilder.Entity<AddressDao>.ToTable("Address");
modelBuilder.Entity<PersonDao>.ToTable("Person");
0
Jarosław Kończak 3 Янв 2017 в 13:08