J'ai une table Product qui utilise UPC comme partie de la clé primaire. Tout va bien jusqu'à ce que le produit ne dispose pas d'un CUP et la façon recommandée de résoudre ce problème est de générer un nombre entre 8004 + numéro d'identité et 8005 + numéro d'identité.Entity Framework 4: comment insérer le nombre supérieur suivant sans utiliser de champ d'identité?
Je dois générer un code UPC unique si le code UPC est zéro lors d'une transaction, puis être en mesure de récupérer les nouveaux codes UPC pour les produits qui ont zéro comme valeur UPC.
Dans SQL, je pouvais le faire:
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
Comment pourrais-je faire dans Entity Framework 4? Une préoccupation distincte est que tout cela est sous une seule transaction, de sorte que l'attribution de nombres d'ensembles de codes CUP manquants pourrait affecter le même CUP à tous les nouveaux produits.
EDIT:
J'ai fini par créer une vue qui ressemble à ceci pour obtenir le prochain numéro le plus élevé, mais EF ne génère pas la table dans un diagramme, car il ne peut pas déterminer une clé primaire. Si je bidouille le XML, cela fonctionne jusqu'à ce que je mette à jour depuis la base de données, ce qui efface mes changements.
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
La question est la même: Comment pourriez-vous générer le moins le plus grand nombre disponible dans Entity Framework 4, à savoir, comment pourriez-vous réécrire la requête SQL ci-dessus dans LINQ to Entities, ou comment pourriez-vous obtenir la vue à afficher dans le diagramme Entity Framework 4 sans modifier le fichier XML qui lance vos modifications à l'actualisation?
EDIT: Cela semble générer la prochaine disponible 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