В моей модели у меня есть отношение "многие ко многим" к одной и той же таблице. Вот так:
public class BpsModel {
[Key]
public int Id { get; set; }
public string Name { get; set; }
public List<Person> Reviewers { get; set; }
public List<Person> Modelers { get; set; }
}
public class Person
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
Когда я запускаю миграции, это структура таблицы Person базы данных:
migrationBuilder.CreateTable(
name: "Persons",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Sqlite:Autoincrement", true),
BpsModelId = table.Column<int>(nullable: true),
BpsModelId1 = table.Column<int>(nullable: true),
Email = table.Column<string>(nullable: true),
Name = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Persons", x => x.Id);
table.ForeignKey(
name: "FK_Persons_BpsRecords_BpsModelId",
column: x => x.BpsModelId,
principalTable: "BpsRecords",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Persons_BpsRecords_BpsModelId1",
column: x => x.BpsModelId1,
principalTable: "BpsRecords",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
Как видите, в таблице Person есть два столбца с очень похожими именами: BpsModelId и BpsModelId1. Это бесполезно, так как теперь мне нужно искать, какой из них - разработчик моделей, а какой - рецензент. Есть ли способ изменить имя столбца на что-то вроде ReviewerBpsModelId и ModelerBpsModelId?
Спасибо





Если вы хотите, чтобы [KEY] имел определенное имя в базе данных, вы можете использовать DataAnnotations в своем классе модели для настройки имени столбца SQL Server. Это называется Сопоставление столбцов.
Итак, вы могли:
public class BpsModel {
[Key]
[Column("my_custom_column_name")]
public int Id { get; set; }
public string Name { get; set; }
public List<Person> Reviewers { get; set; }
public List<Person> Modelers { get; set; }
}
В вашем методе OnModelCreating вы должны установить его, используя плавную конфигурацию, как показано ниже:
modelBuilder.Entity<BpsModel>()
.HasMany(p => p.Reviewers)
.WithOne()
.HasForeignKey("BpsModelReviewerId"); // <- You customize the foreign key name for Reviewers association
modelBuilder.Entity<BpsModel>()
.HasMany(p => p.Modelers)
.WithOne()
.HasForeignKey("BpsModelModelerId"); // <- You customize the foreign key name for Modelers association
Это вариант, но разве ему не нужно использовать DataAnnotations?
@JohnOsborne Если вы используете атрибут, вы можете использовать только имена свойств, которые должны быть определены в сущности Person. Фактический код не определяет для этого свойства внешнего ключа. Таким образом, вы не можете настроить имена столбцов внешнего ключа с помощью аннотаций данных.
Это происходит потому, что вам нужно два поля Int, одно для хранения кода Modeler, а другое для Reviewer, проблема в том, что на эти два ключа ссылается одна и та же таблица. так сделайте, чтобы решить проблему.
внешний ключ для Reviewer
[ForeignKey("ReviewerId")]
public int ReviewerId { get; set; }
public Person Reviewers { get; set; }
внешний ключ для Modeler
[ForeignKey("ModelerId")]
public int ModelerId { get; set; }
public Person Modelers { get; set; }
ваш класс будет выглядеть так
public class BpsModel {
[Key]
public int Id { get; set; }
public string Name { get; set; }
[ForeignKey("ReviewerId")]
public int ReviewerId { get; set; }
public Person Reviewers { get; set; }
[ForeignKey("ModelerId")]
public int ModelerId { get; set; }
public Person Modelers { get; set; }
}
public class Person
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public ICollection<BpsModel> BpsModel{ get; set; }
}
добавить использование:
using System.ComponentModel.DataAnnotations.Schema;
Запускаем Add-Migrations, это работа в моих проектах!
Это помогает? -> docs.microsoft.com/en-us/ef/core/modeling/relational/columns - HasColumnName () может быть тем, что вы ищете