2017-01-04 2 views
1

У меня есть модель для заказов. Они оба являются ключами и не могут быть дублированы. Я установил OrderId как Identity в Map класс. Как вставить новую строку со сложным ключом, когда один столбец идентичен, а другой нет?

class Order { 
    public int OrderId {get;set;} 
    public int OrderNumber {get;set;} 
    ...  
} 

Теперь нужно создать новый ORDERNUMBER, чтобы вставить строку. Я знаю, что в SQL я могу обернуть транзакцию и сделать MAX(OrderNumber) + 1, но как я могу это сделать в Entity Framework?

+1

Почему, для чего это служит? Почему бы не использовать 'OrderId' вместо этого? – Igor

+0

@Igor Я хочу группировать заказы на 'OrderNumber' и хочу избежать возможных дубликатов, когда создаются разные заказы. –

+0

1. Вы указали выше, что OrderNumber уникален, поэтому вы не можете упорядочить заказ по номеру заказа в соответствии с приведенным выше объяснением. 2. Использование идентификатора гарантирует уникальность внутри этой таблицы, поэтому я не вижу смысла иметь OrderNumber. Вам не хватает чего-то в объяснении? – Igor

ответ

1

Вы можете сделать OrderNumber столбец идентификаторов:

class Order 
{ 
    public int OrderId { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int OrderNumber { get; set; } 
} 

По соглашению, Entity Framework будет признать, что OrderId является первичным ключом; однако он не будет автоматически столбцом идентификации, поэтому вам нужно добавить DatabaseGenerated(DatabaseGeneratedOption.Identity) в OrderId, вы хотите, чтобы он автоматически увеличивался.

Однако, если вы не хотите, чтобы изменить вашу базу данных, вы можете обернуть вставки в сделке:

using (var transaction = modelContext.BeginTransaction()) 
{ 
    var newOrderNumber = modelContext.Orders.Max(o => o.OrderNumber) + 1; 
    var newOrder = new Order { OrderNumber = newOrderNumber }; 
    ... 
    transaction.Commit(); 
} 

А затем присвоить это значение плюс один для вашего нового Order объекта.

+0

Вы имеете в виду, что IsolationLevel.Serializable будет достаточно? –

+0

Да, это сработает для вас. –

+0

Спасибо! Не могли бы вы исправить 'maxOrderNumber' до' maxOrderNumber + 1', чтобы я мог его одобрить? –

 Смежные вопросы

  • Нет связанных вопросов^_^