Entity Framework генерирует guid как идентификатор и сохраняет его - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь сохранить в своей таблице. Пользователи, скажем, идентификатор строки, адрес электронной почты и пароль строки. Проблема в том, что ID должен быть подсказкой, что я должен его создать и сохранить, а не SQL сервер. Есть идеи как? Я искал немного, но я только нашел, как сделать sql сервер для создания guid. Спасибо!

1 Ответ

0 голосов
/ 21 апреля 2020

Прежде всего, скажите Entity Framework, что вы сгенерируете значение первичного ключа: Используйте DatabaseGenerated Attribute

public class School
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }
    public string Name {get; set;}
    ...
}

Параметр None предотвращает создание значений базой данных. автоматически в тех случаях, когда они будут созданы в противном случае.

Кроме того, рассмотрите возможность перезаписи DbContext.SaveChanges (). В этой процедуре запросите ChangeTracker для всех добавляемых элементов. Генерация идентификатора для каждого добавленного элемента. Может быть опасно позволить другим генерировать Id, потому что они могут добавлять постоянное значение или просто автоинкремент.

Другой возможностью было бы сгенерировать ее в функции Add, но если вы это сделаете, пользователи могут изменить ваш сгенерированный Id. Таким образом, правильное место в SaveChanges:

public override int SaveChanges()
{
    var addedElements = this.ChangeTracker.Entries
        .Where(entry => entry.State == EntityState.Added);

    foreach(var addedElement in addedElements)
    {
        // This will fail: the added element doesn't have a property Id:
        addedElement.Id = GenerateId();
    }
    return base.SaveChanges();
}

Для этого вы должны быть уверены, что у каждого добавленного элемента есть свойство Id. Самый простой способ - создать интерфейс и позволить всем вашим таблицам реализовать этот интерфейс:

public interface IID
{
    string Id {get; set;}
}

public class School : IID {...}
public class Student : IID {...}
public class Teacher : IID {...}

public class DbContext
{
    public DbSet<School> Schools {get; set;}
    public DbSet<Student> Students{get; set;}
    public DbSet<Teacher> Teachers {get; set;}

    public override int SaveChanges()
    {
         var addedElements = this.ChangeTracker.Entries.Cast<IID>
        .Where(entry => entry.State == EntityState.Added);

        foreach(var addedElement in addedElements)
        {
            addedElement.Id = GenerateId(); // Every Added element implements IId
        }
        return base.SaveChanges();
    }

    private string GenerateId()
    {
         ... // TODO: return unique ID, for instance a GUID
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...