Entity Framework 6 .add () с таблицей переменных и именем столбца - PullRequest
0 голосов
/ 05 декабря 2018

Я могу получить несколько динамический результат поиска Entity Framework в следующем упрощенном примере, который извлекает один результат из БД или кеша:

    string strTableName = "TableName2"
    string strColumnName = "MyColumnName"
    int intPrimaryKey = 1

    Type returnType;
    returnType = typeof(TableName1);
    string queryResults = null;
    switch (strTableName)
    {
        case "TableName2":
            returnType = typeof(TableName2);
            break;
    }

    var refColumnName = returnType.GetProperty(strColumnName );
    var query = mydbEntity.Set(returnType).Find(intPrimaryKey );
    var queryResults = refColumnName.GetValue(query).ToString();

Это также можно адаптировать для обновления записи:

        DataQuery.LeadsEntity.Entry(query).Property(strColumnName ).CurrentValue = "Whatever";
        DataQuery.LeadsEntity.SaveChanges();

Есть ли эквивалент для пути для .set (returnType) .Add ()?Я не уверен, есть ли способ сделать такое мышление, используя таблицу переменных и имена столбцов:

DataQuery.LeadsEntity.Set(returnType).Add(new returnType { PrimayKeyName = 1, refColumnName = "Something" });

1 Ответ

0 голосов
/ 06 декабря 2018

Если вы априори не знаете, как называется свойство первичного ключа, было бы немного больно получать его от типа.

Этот - это способ, который я нашел более надежным для получения первичного ключа из типа сущности:

private string[] GetKeyNames(DbContext context, Type entityType)
{
    ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
    //create method CreateObjectSet with the generic parameter of the base-type
    MethodInfo method = typeof(ObjectContext).GetMethod("CreateObjectSet", Type.EmptyTypes)
                                             .MakeGenericMethod(entityType);
    dynamic objectSet = method.Invoke(objectContext, null);
    IEnumerable<dynamic> keyMembers = objectSet.EntitySet.ElementType.KeyMembers;
    string[] keyNames = keyMembers.Select(k => (string)k.Name).ToArray();
    _keyNamesCache[entityType] = keyNames;
    return keyNames;
}

Но если предположить, что ваши первичные ключи всегда являются одним свойством,Вы можете использовать отражение, чтобы создать объект сущности и установить его свойства следующим образом:

private void CreateEntity(Type entityType, object pkValue, Dictionary<string, object> Columns)
{
    // Create the new entity
    var entity = Activator.CreateInstance(entityType);
    // Get the primary key property name
    var pkName = GetKeyNames(context, entityType).First(); 
    // Set Pk value
    entityType.GetProperty(pkName).SetValue(entity, pkValue);
    // Set other column(s)
    foreach (var col in Columns)
    {
        entityType.GetProperty(col.Key).SetValue(entity, col.Value);
    }
    // Add the entity to the DbSet
    using (var context = new YourContext())
    {
        context.Set(entityType).Add(entity);
    }
}
...