Если у меня есть следующая модель:
[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. Мне нужно, чтобы это работало автоматически и глобально.
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
}
"Dao"
? Чтобы ответить на вопрос, я не знаю способа глобально переопределить соглашение по умолчанию.
Dao
, чтобы отличать их от классов домена (структура которых не может быть напрямую отображена с помощью EF).
Если вы хотите создать собственное имя столбца в базе данных, вы можете использовать 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");
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.