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" });
}

плод такой труды:

SQLiteStudio showing the generated table