Scrivo un repository generico in CRUD in EF.In aggiunta il metodo è scritto in questo modo
public class GenericRepo<T> where T : class
{
//Create
public static void Add(CellPhoneProjectEntities dbContext, T entity)
{
dbContext.Set<T>().Add(entity);
dbContext.SaveChanges();
}
}
funziona bene voglio ottenere il primo elemento dell'entità (chiave primaria, colonna Identità)
public static long Add(CellPhoneProjectEntities dbContext, T entity,long id)
{
dbContext.Set<T>().Add(entity);
dbContext.SaveChanges();
var pk = entity.ElementType.KeyMembers[0];
//Something like first elemnt by generic
return pk as Long;
}
qualcuno può aiutare a ottenere il primo elemento (Id) dell'entità dopo l'inserimento?
EDIT: prima il database EF e la mia chiave primaria non è nominata ..
Piuttosto è TableNameId ad es. Tabella ProjectMaster ha la chiave primaria ProjectMasterId
Quando si assume che l'ID dell'elemento sia long
è il primo elemento della chiave, si stanno formulando ipotesi esplicitamente non generiche . Non tutte le entità hanno una chiave long
o un tasto.
Se hai questa ipotesi, è meglio averlo esplicitamente dichiarato nel codice. Crea una classe di entità di base con un ID e assicurati che tutte le entità la ereditino. In questo modo sai che ogni entità ha un ID compatibile. Se la colonna della tua tabella ha un nome diverso, puoi utilizzare l'attributo [Column]
per mappare tra di loro:
public abstract class EntityBase
{
public virtual long Id {get; set;}
}
public class MyEntity : EntityBase
{
[Column("TableId"]
public override long Id {get;set;}
}
public long Add(DbContext context, T entity) where T : EntityBase
{
var storedEntity = dbContext.Set<T>().Add(entity);
dbContext.SaveChanges();
return storedEntity.Id; // Will always have the property.
}