Asp.net Core Entity Framework не может найти IndexAttribute
Я получаю следующее из кода Visual Studio на моем Mac, как в IDE, так и в окне консоли после выполнения "dotnet run":
не удалось найти тип или имя пространства имен "IndexAttribute"
У меня есть класс Story, который я хочу использовать для создания базы данных с кодом. У этого класса есть первичный ключ, отмеченный KeyAttribute, и строка автора, отмеченная MaxLengthAttribute, поэтому оба они работают (используя System.ComponentModel.DataAnnotations). Два другие поля, DateTime Date и bool IsPublished, имеют IndexAttribute (это индекс из двух столбцов). Я явно назвал его IX_DatePublished, IsUnique = false и использую Order = 1 для поля даты и Order = 2 для поля IsPublished.
- что я вкладываю в проект.json перед запуском "dotnet restore", чтобы он вытащил правильный материал для IndexAttribute для работы?
- EF, включенный в ASPCore1 для Mac / Linux, не имеет правильного пространства имен включены?
спасибо!
2 ответов
Кажется, это изменилось с тех пор, как вы задали вопрос. jsakamoto реализовал пакет NuGet, который позволяет сохранить атрибут [Index]. Разница лишь порядок переменных; вы больше не можете иметь Order=0
как ваша последняя переменная, а не:
[Index("IX_TreeFiddy", 0, IsUnique = false)]
public string LochNessMonster { get; set; }
[Index("IX_TreeFiddy", 1, IsUnique = false)]
public int CentsGiven { get; set; }
вот ссылка: IndexAttribute для пакета NuGet .NET Core
Я все еще в процессе знакомство с основными инструментами; дальнейшие исследования показали, что эта функция не поддерживается, но они будут рассматривать запрос.
https://github.com/aspnet/EntityFrameworkCore/issues/4050
работающим
рекомендуемый способ добавления индексов в первые модели кода в отсутствие IndexAttribute-использовать Entity Framework Fluent API. Например, следующее Может быть добавлено в контекст (производный от DbContext):
/// <summary>
/// Creates database structure not supported with Annotations using Fluent syntax.
/// </summary>
/// <param name="optionsBuilder">The configuration interface.</param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Story>().HasIndex(
story => new { story.Date, story.Published }).IsUnique(false);
}
это создает индекс из двух столбцов для Story.Дата и история.Публикуется, что не является уникальным. После этого изменения используйте:
dotnet ef migrations add <name>
dotnet ef database update
интересно отметить, какой код миграции генерируется для создания этого индекса (вы можете использовать это непосредственно для настройки миграции для создания индекса вместо добавления кода в свой класс контекста):
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Stories",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("Autoincrement", true),
Author = table.Column<string>(maxLength: 64, nullable: true),
Date = table.Column<DateTime>(nullable: false),
Published = table.Column<bool>(nullable: false),
Title = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Stories", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_Stories_Date_Published",
table: "Stories",
columns: new[] { "Date", "Published" });
}
плод такой труды: