Dies ist eine generische Erweiterungsmethode, die das generische Klonen ermöglicht.
Sie müssen System.Linq.Dynamic
aus Nuget holen .
public TEntity Clone<TEntity>(this DbContext context, TEntity entity) where TEntity : class
{
var keyName = GetKeyName<TEntity>();
var keyValue = context.Entry(entity).Property(keyName).CurrentValue;
var keyType = typeof(TEntity).GetProperty(keyName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).PropertyType;
var dbSet = context.Set<TEntity>();
var newEntity = dbSet
.Where(keyName + " = @0", keyValue)
.AsNoTracking()
.Single();
context.Entry(newEntity).Property(keyName).CurrentValue = keyType.GetDefault();
context.Add(newEntity);
return newEntity;
}
Das einzige, was Sie selbst implementieren müssen, ist die GetKeyName-Methode. Dies kann alles von return typeof(TEntity).Name + "Id"
bis sein return the first guid property
oder die erste mit gekennzeichnete Eigenschaft zurückgeben DatabaseGenerated(DatabaseGeneratedOption.Identity)]
.
In meinem Fall habe ich meine Klassen bereits mit markiert [DataServiceKeyAttribute("EntityId")]
private string GetKeyName<TEntity>() where TEntity : class
{
return ((DataServiceKeyAttribute)typeof(TEntity)
.GetCustomAttributes(typeof(DataServiceKeyAttribute), true).First())
.KeyNames.Single();
}