Я пытаюсь получить обобщенную функцию CloneEntity работы с EF6.0.2Родовой Клон Ef6 Entity
public static T CopyEntity<T>(MyContext ctx, T entity,
bool copyKeys = false) where T : EntityObject
{
T clone = ctx.CreateObject<T>();
PropertyInfo[] pis = entity.GetType().GetProperties();
foreach (PropertyInfo pi in pis)
{
EdmScalarPropertyAttribute[] attrs = (EdmScalarPropertyAttribute[])
pi.GetCustomAttributes(typeof(EdmScalarPropertyAttribute), false);
foreach (EdmScalarPropertyAttribute attr in attrs)
{
if (!copyKeys && attr.EntityKeyProperty)
continue;
pi.SetValue(clone, pi.GetValue(entity, null), null);
}
}
return clone;
}
[обновление] я должен был изменить декларацию
public static T CloneEntity<T>(T entity, bool copyKeys = false) where T : class
Это решило ошибку компиляции: «T» должен быть ссылочным типом, чтобы использовать его как параметр «T» в общем типе или методе
Однако, когда я использую этот метод, никакие свойства не копируются в новый объект.
Вначале я не использую код. Объект, который я использую с ним, был создан из файла edmx.
Вид объекта Я использую его с генерируется из Т4
public partial class job
{
public short LineID { get; set; }
public short CycleID { get; set; }
// other fields
}
Мои DbContext, как
public partial class DataEntities : DbContext
{
public DbSet<job> Jobs { get; set; }
}
[Update]
Я попытался
using (var db = CreateDb())
{
var nJob = new job();
db.jobs.Attach(nJob);
db.Entry(nJob).CurrentValues.SetValues(job);
return nJob;
}
но я получаю ошибку
"The property 'JobID' is part of the object's key information and cannot be modified. "
Контекст представляет собой частичный класс
есть также
partial class DataEntities
{
public DataEntities(string efConnectString)
: base(efConnectString)
{
}
}
Можете ли вы показать нам определение объекта, с которым вы его используете, – Kevin
спасибо, я обновил вопрос с ним. –
Я предполагаю, что частичное ключевое слово отбрасывает его. Можете ли вы убедиться, что каждое определение используемого вами типа наследуется от EntityObject? – Kevin