Entity Framework 4: как вставить следующий по величине номер без использования поля идентичности? - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть таблица Product, которая использует UPC как часть первичного ключа.Все хорошо, пока продукт не имеет UPC, и рекомендуемый способ решить эту проблему - сгенерировать число между 8004 + идентификационный номер и 8005 + идентификационный номер.

Мне нужно сгенерировать уникальный UPC, еслиUPC равен нулю, находясь в транзакции, и затем сможет получать новые UPC только для продуктов, у которых в качестве значения UPC было ноль.

В SQL я мог бы сделать следующее:

 insert into Product (ID, Name)
 select min(pivotTable.value), 'New Product' as Name
 from pivotTable
 where not exists( 
     select null as nothing 
     from product
     where pivotTable.value = product.ID ) and
 pivotTable.value > 8004000000 and pivotTable.value < 8005000000

 select id
 from   product
 where  Name = 'New Product' -- assuming Name is unique

Как бы я сделал это в Entity Framework 4 ?Отдельная проблема заключается в том, что это все в рамках одной транзакции, поэтому назначение номеров наборов отсутствующих UPC может назначить один и тот же UPC для всех новых продуктов.

РЕДАКТИРОВАТЬ:

В итоге я создалПредставление выглядит так, чтобы получить следующее наибольшее число, но EF не будет генерировать таблицу на диаграмме, потому что не может определить первичный ключ.Если я взломаю XML, он будет работать до тех пор, пока я не обновлюсь из базы данных, что стирает мои изменения.

Select min(ID), 'New Product' as Name
from ( select distinct ID
       from   product p1
       where  p1.ID > 8004000000 and p1.ID < 8005000000
       union
       select distinct coalesce( ID, 8004000000) as ID) A

     left outer join

     ( select distinct ID
       from   product p2
       where  p2.ID > 8004000000 and p2.ID < 8005000000
       union
       select distinct coalesce( ID, 8004000000) as ID) B

     on A.ID + 1 = B.ID
where B.ID is null

Так что вопрос такой же: Как вы могли бы генерировать наименьшее наибольшее доступное число в Entity Framework4 , т. Е. Как вы могли бы переписать SQL-запрос, указанный выше, в Linq to Entities, или как вы могли бы показать представление на диаграмме Entity Framework 4 без редактирования файла XML, который отбрасывает ваши изменения при обновлении?

РЕДАКТИРОВАТЬ: кажется, генерирует следующий доступный с помощью Linq:

// Setup our ID list
var prod = DC.Products.Where(p => p.ID > 0 && p.ID < 1000)
    .Select(p => p.ID).Distinct();

// Compare the list against itself, offset by 1.  Look for "nulls"
// which represent "next highest number doesn't exist"
var q = (from p1 in prod
         from p2 in prod.Where(a => a == p1 + 1).DefaultIfEmpty() // Left join
         where p2 == 0                            // zero is null in this case
         select p1).Min();
var r = q + 1;   // one higher than current didn't exist, so that's the answer

1 Ответ

0 голосов
/ 26 августа 2011

не совсем уверен, зачем вам такие сложные вычисления. Однако, если вам нужен всегда уникальный номер для всей базы данных, взгляните на тип RowVersion в таблицах MSSQL. Это даст вам всегда уникальный номер, который меняется каждый раз, когда строка с записью обновляется. И это уникально для всего БД.

...