Стратегия TableGenerator (таблица идентификаторов) в ядре сущностей + SQL ServerC#

Место общения программистов C#
Ответить
Anonymous
 Стратегия TableGenerator (таблица идентификаторов) в ядре сущностей + SQL Server

Сообщение Anonymous »

Существует ли встроенный способ поддержки идентификаторов TableGenerator в Entity Framework? Если нет, то как лучше всего это реализовать?
Документ генератора таблиц (таблица идентификаторов) в Hibernate:
https://docs.oracle.com/javaee/6/api/ja ... rator.html
https://docs.jboss.org/hibernate/orm/5.0 /mappingGuide/en-US/html/ch06.html#identifiers-generators-identity

Определяет генератор первичного ключа, на который можно ссылаться по имени, когда Элемент-генератор указан для аннотации GeneratedValue. Генератор
таблицы может быть указан в классе сущности или в поле или свойстве первичного ключа. Область действия имени генератора является глобальной для
единицы сохранения (для всех типов генераторов).

Код: Выделить всё

Example 1:

@Entity public class Employee {
...
@TableGenerator(
name="empGen",
table="ID_GEN",
pkColumnName="GEN_KEY",
valueColumnName="GEN_VALUE",
pkColumnValue="EMP_ID",
allocationSize=1)
@Id
@GeneratedValue(strategy=TABLE, generator="empGen")
int id;
...
}
Вот пример реализации и моя идея ее реализации.
Создайте новую таблицу в своей базе данных для хранения сгенерированных ключей. В таблице должно быть как минимум два столбца: один для имени ключа (например, «Table1») и один для текущего значения ключа.
Определите новый класс для представления сущности TableGenerator в ваша модель Entity Framework. Этот класс должен сопоставляться с таблицей TableGenerator в вашей базе данных.

Код: Выделить всё

public class TableGenerator
{
public string TableName { get; set; }
public int NextId { get; set; }
}
Добавьте DbSet для сущности TableGenerator в свой класс DbContext.

Код: Выделить всё

public DbSet TableGenerators { get; set; }
Создайте метод в классе DbContext для генерации нового ключа для заданного имени таблицы.

Код: Выделить всё

public int GenerateKey(string tableName)
{
var generator = TableGenerators.SingleOrDefault(t => t.TableName == tableName);

if (generator == null)
{
generator = new TableGenerator { TableName = tableName, NextId = 1 };
TableGenerators.Add(generator);
}

generator.NextId++;

SaveChanges();

return generator.NextId;
}
Используйте метод GenerateKey для создания уникальных ключей для ваших объектов.

Код: Выделить всё

var newId = dbContext.GenerateKey("Table1");

var entity = new MyEntity { Id = newId, Name = "Entity1" };

dbContext.MyEntities.Add(entity);
dbContext.SaveChanges();
Как можно улучшить приведенный выше код и добавить механизм блокировки?
Я использую SQL Server в качестве поставщика базы данных

Подробнее здесь: https://stackoverflow.com/questions/784 ... sql-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»