2

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 

Répondre

0

pas très bien pourquoi avez-vous besoin des calculs complexes. Cependant, si vous avez toujours besoin d'un numéro unique à l'échelle de la base de données, jetez un oeil au type RowVersion dans les tables MSSQL. Il vous donnera toujours le numéro unique qui est changé chaque fois que la ligne avec l'enregistrement est mis à jour. Et c'est unique pour tout un DB.