Как избежать дублирования ключей в Entity Framework - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть очень простой класс, сгенерированный Entity Framework (V 6.2) со свойством, которое также является первичным ключом.

public class Product
{
    public string Name { get; set; }
}

Как я могу убедиться, что при создании нового элемента (илиизменить одно существующее), это мешает мне сделать это, если имя уже существует?

Я знаю, что MyContext.SaveChanges() сгенерирует исключение, но возможно ли сделать это раньше?Например, когда вы звоните MyContext.Products.Add(MyNewProduct)?Или когда имя изменено?

Я могу изменить свойство set в автоматически сгенерированном файле, созданном EF, но оно будет стираться каждый раз, когда я воссоздаю модель ...

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Прежде всего, я не думаю, что проверка уникальности в установщике или в контексте. Хорошая идея - метод Add (), поскольку вы можете столкнуться с проблемами производительности, когда добавляете несколько сущностей одновременно.Добавление проверки в переопределенный метод SaveChanges (), вероятно, является лучшей идеей.

Вы можете изменить шаблон генерации кода EF (https://docs.microsoft.com/en-us/ef/ef6/modeling/designer/codegen/), чтобы сгенерировать проверки для каждого требуемого типа сущности на основе некоторого расширенного свойства или некоторых других метаданных в базе данных, на что-то другое.как это:

public override int SaveChanges()
{
    var productNames = ChangeTracker.Entries<Products>()
        .Where(x => (x.State == EntityState.Added) || 
            (x.State == EntityState.Modified && x.OriginalValues["Name"] != x.CurrentValues["Name"]))
        .Select(x => x.Entity.Name)
        .ToList();
    if (Products.Any(x => productNames.Contains(x.Name)))
    {
        throw new Exception("Duplicated keys");
    }
    // same goes for other similar entities

    return base.SaveChanges();
}
0 голосов
/ 13 сентября 2018
        if (db.Products.Any(p => p.Name == newProduct.Name))
        {
            return "A record with the same name already exists.";
        }
        else
        {
            db.Products.Add(newProduct);
            db.SaveChanges();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...