2015-09-25 3 views
0

лица:Как обновить только одну строку с вставленным

public class Feature { 
    public int Id {get;set;} 
    public int DeviceId {get;set;} 
    public string Value {get;set;} 
    public bool IsPrimary {get;set;} 
    } 

истории:

Каждое устройство имеет список функций. Но только один из них может быть первичным.

Значение «IsPrimary» может быть изменена:

  • WebAPI устанавливает «истинный» после создания, если устройство не получил какой-либо основной функции в БД
  • Может быть изменено пользователем Мануалы

Существует много параллельных запросов. И когда они выполняются, и устройство не имеет своих целей, все эти параллельные запросы создают функцию «Исправлено» = истинная.

Как справиться с этой ситуацией?

+0

Как бы вы определить, какой из них будет фактическим первичная, или это первый один, который был добавлен к БД – 3dd

+0

Да, функция станет основной, если другой первичным функция не существует –

ответ

1

Я бы справился с этим немного по-другому: IsPrimary должен быть свойством устройства, а не Feature. Что-то вроде этого:

public class Device 
{ 
    public List<Feature> Features { get; set; } 
    public Feature PrimaryFeature { get; set; } 
    // ... 
} 

public class Feature 
{ 
    public int Id { get; set; } 
    public int DeviceId { get; set; } 
    public string Value { get; set; } 
} 

Кроме того, вы должны выполнять некоторый параллелизм проверку: https://msdn.microsoft.com/en-ca/data/jj592904.aspx

Таким образом, если два пользователя пытается изменить то же самое устройство в то же время, один из них получит сообщение об ошибке, и он/она может действовать соответствующим образом. Или вы можете справиться с проблемой параллелизма, но считаете нужным.

Это может быть немного более полезным: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

+0

Да, я подумал об этом, но хотел найти какое-то решение без большой переделки кода. Но нет другого простого и правильного пути, как это. –

0

Установите флаг, в котором вы записываете запись в базу данных и проверяете, есть ли свойство в таблице, которая уже имеет IsPrimary = true. Таким образом, у вас не будет нескольких записей IsPrimary в вашей базе данных. И тогда пользователь может переключать основную функцию между существующими записями.

+0

Приложение WebApi уже проверяет это. Но это проблема. Когда два запроса поступают в тот же момент, и устройство не имеет функций, каждый запрос создает основную функцию, потому что они одновременно проверяют, что для этого устройства нет никаких функций. –