Entity Framework вставить в таблицу с идентификатором из другой таблицы - PullRequest
0 голосов
/ 10 января 2020

Я хотел бы спросить о вставке новой записи в таблицу через структуру сущностей. Я написал первичный ключ (id и Department_id). Department_Id является постоянным, поскольку существуют отделы, и каждый отдел может создавать новые записи. Каждая запись копируется во все отделы. Идентификатор идентичен по отделу. Но это не может быть идентификатором для столбца, потому что, когда все отделы могут создать запись с Id = 1, но отдел_ид будет другим. Теперь я решаю, что создаю новую запись в фиктивной таблице, в которой есть столбец идентификаторов, и получаю это значение в столбце идентификаторов и сохраняю запись. Поэтому для каждой таблицы у меня есть специализированная таблица с идентификатором столбца для генерируемого значения Id.

Таблица Customer (Id int, Department_Id int,…) Id, Department_Id является первичным ключом.

Таблица CustomerIdentity (Id int identity (1,1), Dummy int null).

Я сохранил процедуру для сохранения новой записи:

declare @id int 

declare @department_id int = 10 -- constant for department 10 

insert into CustomerIdentity(Dummy) values (null) 

set @id = scope_identity() 

insert into Customer(Id, Department_Id, …) values (@id, @department_id, …) 

Я выполняю рефакторинг этого кода, чтобы извлечь logi c из хранимой процедуры в C#, где у меня есть сущность Customer. Идентификатор не может быть идентификатором, потому что могут быть записи как:

Идентификатор | Department_Id

1 | 1 - запись из отдела 1.

1 | 2 - запись из отдела 2.

1 | N - запись из отдела N.

Итак, есть таблица идентификаторов, в которой хранится значение идентификатора для каждого отдела. Каждая запись из отдела 1..N копируется во все отделы. Как настроить EF для выдачи значения для столбца Id из другой таблицы?

1 Ответ

0 голосов
/ 10 января 2020

Чтобы сделать что-то с EF, я бы посмотрел на что-то вроде:

using (var context = new MyDbContext())
{
    var customerIdentity = new CustomerIdentity();
    context.CustomerIdentities.Add(customerIdentity);
    context.SaveChanges();
    var newCustomer = new Customer
    {
        DepartmentId = _DepartmentId, // I.e. "10"
        CustomerId = customerIdentity.CustomerId
        // ...
    }
    // Optionally you could delete the CustomerIdentity record.
    context.CustomerIdentities.Remove(customerIdentity);
    context.SaveChanges();
}

Это предполагает, что у каждого отдела будет своя собственная база данных, которая будет управлять своими собственными таблицами идентификации для идентификаторов, но будет синхронизирована с другие базы данных или центральная база данных, где будут запрашиваться данные между отделами. CustomerIdentity обеспечивает последовательность (автоинкремент) для идентификаторов, поэтому после извлечения (первый вызов SaveChanges) и выделения в запись Customer запись CustomerIdentity может быть удалена. Таблица останется пустой, но идентификатор будет продолжать увеличиваться. Если вы решите сохранить строку CustomerIdentity, вы должны избегать связывания сущностей Customer и CustomerIdentity в отношениях в EF, даже если для отдела они будут образовывать отношения 1: 1. Счетчики идентификационных данных других отделов могут быть выше, и такая связь может привести к ошибкам, если целевая база данных имеет идентификационные данные, скажем, до 50, а запись будет добавлена ​​с идентификатором 65. Идентификационный номер 65 еще не существует, поэтому EF будет выбрасывать нарушение FK, если вы попытаетесь внести эту запись клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...