Индексы модели не проверяются - PullRequest
0 голосов
/ 23 апреля 2019

Таблица в postgres:

CREATE TABLE "public"."filters" (
  "Id" int4 NOT NULL DEFAULT nextval('"filters_Id_seq"'::regclass),
  "Name" varchar(200) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying,
  "Type" int4 NOT NULL,
  "Alias" varchar(200) COLLATE "pg_catalog"."default" NOT NULL DEFAULT ''::character varying
)
;

-- ----------------------------
-- Indexes structure for table filters
-- ----------------------------
CREATE UNIQUE INDEX "filters_unique_alias_key" ON "public"."filters" USING btree (
  "Alias" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE UNIQUE INDEX "filters_unique_name_key" ON "public"."filters" USING btree (
  "Name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);

-- ----------------------------
-- Primary Key structure for table filters
-- ----------------------------
ALTER TABLE "public"."filters" ADD CONSTRAINT "filters_primary_key" PRIMARY KEY ("Id");

Модель:

[Table("filters")]
    public class Filter
    {
        [Key] public int Id { get; set; }

        [Required]
        [StringLength(200)]
        public string Name { get; set; }

        [Required]
        [StringLength(200)]
        public string Alias { get; set; }

        [Required] public FilterType Type { get; set; }
    }

    public enum FilterType
    {
        Logic = 0,
        Text = 1,
        Number = 2
    }

Контекст:

protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);

            builder.Entity<Filter>().HasIndex(model => model.Name).HasName("filters_unique_name_key").IsUnique();
            builder.Entity<Filter>().HasIndex(model => model.Alias).HasName("filters_unique_alias_key").IsUnique();
        }

Я делаю пост-запрос с НЕ уникальными значениями и получаю DbUpdateException от postgres:

public IActionResult Create(Filter filter = null)
        {
            if (ModelState.IsValid && filter != null)
            {

                // code

            }
        }

Почему, если я определил индексы по свободному API, состояние модели допустимо, но проверка индекса не работает? Кажется, ядро ​​игнорирует проверку индексов, но почему? Как это проверить?

1 Ответ

0 голосов
/ 23 апреля 2019

Уникальная конфигурация API свободного индекса не влияет на проверку модели. Он не может знать, является ли конкретное объявленное значение уникальным или нет, не запрашивая базу данных, а это не то, что связыватель моделей уполномочен делать или даже должен делать. Если вы хотите добавить проверку для этого, вам нужно будет сделать это вручную.

var filter = await _context.Filters.FirstOrDefaultAsync(x => x.Name == model.Name || x.Alias == model.Alias);
if (filter?.Name == model.Name)
    ModelState.AddModelError(nameof(model.Name), "Name must be unique.");
if (filter?.Alias == model.Alias)
    ModelState.AddModelError(nameof(model.Alias), "Alias must be unique.");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...