C# ociationEnd.Name.EndsWith(“_Target”); object relatedObject=propertyInfo.GetValue(entityObject,null); foreach(ScalarPropertyMappi
ociationEnd.Name.EndsWith(“_Target”); object relatedObject=propertyInfo.GetValue(entityObject,null); foreach(ScalarPropertyMapping propertyMapping in propertyMappings.propertyMappings) { 字符串columnName=propertyMapping.Column.Name; string paramName=string.Format(“@p{0}”,paramCount); 对象columnValue=relatedObject==null? 无效的: relatedObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(relatedObject,null); 如果(参数计数!=0) { sqlColumns+=“,”; sqlValues+=“,”; } sqlColumns+=SqlQuote(columnName); sqlValues+=string.Format(“@p{0}”,paramCount); DbParameter=command.CreateParameter(); 参数值=列值; parameter.ParameterName=paramName; command.Parameters.Add(参数); paramCount++; } } stringsql=string.Format(“插入到{0}({1})值({2})”,tableName,sqlColumns,sqlValues); command.CommandText=sql; foreach(command.Parameters中的DbParameter参数) { if(parameter.Value==null) parameter.Value=DBNull.Value; } 返回命令; } public int ExecuteUpdateCommand(对象entityObject) { DbCommand=GenerateUpdateCommand(entityObject); ConnectionState oldConnectionState=command.Connection.State; 尝试 { if(oldConnectionState!=ConnectionState.Open) command.Connection.Open(); int result=command.ExecuteNonQuery(); 返回结果; } 最后 { if(oldConnectionState!=ConnectionState.Open) command.Connection.Close(); } } 公共DbCommand GenerateUpdateCommand(对象entityObject) { ObjectContext=((IOObjectContextAdapter)Context).ObjectContext; var metadataWorkspace=((EntityConnection)objectContext.Connection).GetMetadataWorkspace(); IEnumerable entitySetMappingCollection=metadataWorkspace.GetItems(DataSpace.CSSpace).Single().EntitySetMappings; IEnumerable associationSetMappingCollection=metadataWorkspace.GetItems(DataSpace.CSSpace).Single().AssociationSetMappings; 字符串entityTypeName; 如果(!entityObject.GetType().Namespace.Contains(“DynamicProxi”)) entityTypeName=entityObject.GetType().Name; 其他的 entityTypeName=entityObject.GetType().BaseType.Name; var entitySetMappings=entitySetMappingCollection.First(o=>o.EntityTypeMappings.Select(e=>e.EntityType.Name).Contains(entitytytypename)); var entityTypeMapping=entitySetMappings.EntityTypeMappings[0]; string tableName=entityTypeMapping.EntitySetMapping.EntitySet.Name; MappingFragment MappingFragment=entityTypeMapping.Fragments[0]; string sqlColumns=string.Empty; int paramCount=0; DbCommand=Context.Database.Connection.CreateCommand(); foreach(属性映射映射mappingFragment.PropertyMappings中的属性映射) { if(((ScalarPropertyMapping)propertyMapping).Column.StoreGeneratedPattern!=StoreGeneratedPattern.None) 继续; 字符串columnName=((ScalarPropertyMapping)propertyMapping).Column.Name; if(entityTypeMapping.EntityType.KeyProperties.Select(\u=>\ uType.Name).Contains(columnName)) 继续; object columnValue=entityObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(entityObject,null); string paramName=string.Format(“@p{0}”,paramCount); 如果(参数计数!=0) sqlColumns+=“,”; sqlColumns+=string.Format(“{0}={1}”,SqlQuote(columnName),paramName); DbParameter=command.CreateParameter(); parameter.Value=columnValue??DBNull.Value; parameter.ParameterName=paramName; command.Parameters.Add(参数); paramCount++; } foreach(entityTypeMapping.EntityType.NavigationProperties中的var navigationProperty) { PropertyInfo PropertyInfo=entityObject.GetType().GetProperty(navigationProperty.Name); if(typeof(System.Collections.IEnumerable.IsAssignableFrom(propertyInfo.PropertyType)) 继续; AssociationSetMapping AssociationSetMapping=associationSetMappingCollection.First(a=>a.AssociationSet.ElementType.FullName==navigationProperty.RelationshipType.FullName); EndPropertyMapping propertyMappings=associationSetMapping.AssociationTypeMapping.MappingFragment.propertyMappings.Cast().First(p=>p.AssociationEnd.Name.EndsWith(“_Target”); object relatedObject=propertyInfo.GetValue(entityObject,null); foreach(ScalarPropertyMapping propertyMapping in propertyMappings.propertyMappings) { 字符串columnName=propertyMapping.Column.Name; string paramName=string.Format(“@p{0}”,paramCount); 对象columnValue=relatedObject==null? 无效的: relatedObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(relatedObject,null); 如果(参数计数!=0) sqlColumns+=“,”; sqlColumns+=string.Format(“{0}={1}”,SqlQuote(columnName),paramName); DbParameter=command.CreateParameter(); parameter.Value=columnValue??DBNull.Value; parameter.ParameterName=paramName; command.Parameters.Add(参数); paramCount++; } } 字符串sqlWhere=string.Empty; bool first=true; foreach(entityTypeMapping.EntityType.KeyProperties中的EdmProperty keyProperty) { var propertyMapping=mappingFragment.PropertyMappings.First(p=>p.Property.Name==keyProperty.Name); 字符串columnName=((ScalarPropertyMapping)propertyMapping).Column.Name; object columnValue=entityObject.GetType().GetPrC# ociationEnd.Name.EndsWith(“_Target”); object relatedObject=propertyInfo.GetValue(entityObject,null); foreach(ScalarPropertyMappi,c#,entity-framework,C#,Entity Framework,ociationEnd.Name.EndsWith(“_Target”); object relatedObject=propertyInfo.GetValue(entityObject,null); foreach(ScalarPropertyMapping propertyMapping in propertyMappings.propertyMappings) { 字符串columnName=propertyMapping.Column.Name; string paramName=str
var userService = IoC.GetInstance<IUserService>();
var users = userService.GetAll().Where(x => x.IsRegistered == true);
var statisticsService = IoC.GetInstance<IStatisticsService>();
foreach (var user in users.ToList())
{
var statistic1 = GetStatistic(1); // this returns an object
var statistic 2 = GetStatistic(2);
statisticsService.Add(statistic1);
statisticsService.Add(statistic2);
statisticsService.Commit(); /* this is essentially a dbContext.SaveChanges(); */
}
function Statistic GetStatistic(int statisticnumber)
{
var stat = new Statistic();
stat.Type = statisticnumber;
switch(statisticnumber) {
case 1:
stat.Value = /* query to count how many times they've logged in */
break;
case 2:
stat.Value = /* query to get their average score */
break;
...
}
return stat;
}
public int ExecuteInsertCommand(object entityObject)
{
DbCommand command = GenerateInsertCommand(entityObject);
ConnectionState oldConnectionState = command.Connection.State;
try
{
if (oldConnectionState != ConnectionState.Open)
command.Connection.Open();
int result = command.ExecuteNonQuery();
return result;
}
finally
{
if (oldConnectionState != ConnectionState.Open)
command.Connection.Close();
}
}
public DbCommand GenerateInsertCommand(object entityObject)
{
ObjectContext objectContext = ((IObjectContextAdapter)Context).ObjectContext;
var metadataWorkspace = ((EntityConnection)objectContext.Connection).GetMetadataWorkspace();
IEnumerable<EntitySetMapping> entitySetMappingCollection = metadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single().EntitySetMappings;
IEnumerable<AssociationSetMapping> associationSetMappingCollection = metadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single().AssociationSetMappings;
var entitySetMappings = entitySetMappingCollection.First(o => o.EntityTypeMappings.Select(e => e.EntityType.Name).Contains(entityObject.GetType().Name));
var entityTypeMapping = entitySetMappings.EntityTypeMappings[0];
string tableName = entityTypeMapping.EntitySetMapping.EntitySet.Name;
MappingFragment mappingFragment = entityTypeMapping.Fragments[0];
string sqlColumns = string.Empty;
string sqlValues = string.Empty;
int paramCount = 0;
DbCommand command = Context.Database.Connection.CreateCommand();
foreach (PropertyMapping propertyMapping in mappingFragment.PropertyMappings)
{
if (((ScalarPropertyMapping)propertyMapping).Column.StoreGeneratedPattern != StoreGeneratedPattern.None)
continue;
string columnName = ((ScalarPropertyMapping)propertyMapping).Column.Name;
object columnValue = entityObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(entityObject, null);
string paramName = string.Format("@p{0}", paramCount);
if (paramCount != 0)
{
sqlColumns += ",";
sqlValues += ",";
}
sqlColumns += SqlQuote(columnName);
sqlValues += paramName;
DbParameter parameter = command.CreateParameter();
parameter.Value = columnValue;
parameter.ParameterName = paramName;
command.Parameters.Add(parameter);
paramCount++;
}
foreach (var navigationProperty in entityTypeMapping.EntityType.NavigationProperties)
{
PropertyInfo propertyInfo = entityObject.GetType().GetProperty(navigationProperty.Name);
if (typeof(System.Collections.IEnumerable).IsAssignableFrom(propertyInfo.PropertyType))
continue;
AssociationSetMapping associationSetMapping = associationSetMappingCollection.First(a => a.AssociationSet.ElementType.FullName == navigationProperty.RelationshipType.FullName);
EndPropertyMapping propertyMappings = associationSetMapping.AssociationTypeMapping.MappingFragment.PropertyMappings.Cast<EndPropertyMapping>().First(p => p.AssociationEnd.Name.EndsWith("_Target"));
object relatedObject = propertyInfo.GetValue(entityObject, null);
foreach (ScalarPropertyMapping propertyMapping in propertyMappings.PropertyMappings)
{
string columnName = propertyMapping.Column.Name;
string paramName = string.Format("@p{0}", paramCount);
object columnValue = relatedObject == null ?
null :
relatedObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(relatedObject, null);
if (paramCount != 0)
{
sqlColumns += ",";
sqlValues += ",";
}
sqlColumns += SqlQuote(columnName);
sqlValues += string.Format("@p{0}", paramCount);
DbParameter parameter = command.CreateParameter();
parameter.Value = columnValue;
parameter.ParameterName = paramName;
command.Parameters.Add(parameter);
paramCount++;
}
}
string sql = string.Format("INSERT INTO {0} ({1}) VALUES ({2})", tableName, sqlColumns, sqlValues);
command.CommandText = sql;
foreach (DbParameter parameter in command.Parameters)
{
if (parameter.Value == null)
parameter.Value = DBNull.Value;
}
return command;
}
public int ExecuteUpdateCommand(object entityObject)
{
DbCommand command = GenerateUpdateCommand(entityObject);
ConnectionState oldConnectionState = command.Connection.State;
try
{
if (oldConnectionState != ConnectionState.Open)
command.Connection.Open();
int result = command.ExecuteNonQuery();
return result;
}
finally
{
if (oldConnectionState != ConnectionState.Open)
command.Connection.Close();
}
}
public DbCommand GenerateUpdateCommand(object entityObject)
{
ObjectContext objectContext = ((IObjectContextAdapter)Context).ObjectContext;
var metadataWorkspace = ((EntityConnection)objectContext.Connection).GetMetadataWorkspace();
IEnumerable<EntitySetMapping> entitySetMappingCollection = metadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single().EntitySetMappings;
IEnumerable<AssociationSetMapping> associationSetMappingCollection = metadataWorkspace.GetItems<EntityContainerMapping>(DataSpace.CSSpace).Single().AssociationSetMappings;
string entityTypeName;
if (!entityObject.GetType().Namespace.Contains("DynamicProxi"))
entityTypeName = entityObject.GetType().Name;
else
entityTypeName = entityObject.GetType().BaseType.Name;
var entitySetMappings = entitySetMappingCollection.First(o => o.EntityTypeMappings.Select(e => e.EntityType.Name).Contains(entityTypeName));
var entityTypeMapping = entitySetMappings.EntityTypeMappings[0];
string tableName = entityTypeMapping.EntitySetMapping.EntitySet.Name;
MappingFragment mappingFragment = entityTypeMapping.Fragments[0];
string sqlColumns = string.Empty;
int paramCount = 0;
DbCommand command = Context.Database.Connection.CreateCommand();
foreach (PropertyMapping propertyMapping in mappingFragment.PropertyMappings)
{
if (((ScalarPropertyMapping)propertyMapping).Column.StoreGeneratedPattern != StoreGeneratedPattern.None)
continue;
string columnName = ((ScalarPropertyMapping)propertyMapping).Column.Name;
if (entityTypeMapping.EntityType.KeyProperties.Select(_ => _.Name).Contains(columnName))
continue;
object columnValue = entityObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(entityObject, null);
string paramName = string.Format("@p{0}", paramCount);
if (paramCount != 0)
sqlColumns += ",";
sqlColumns += string.Format("{0} = {1}", SqlQuote(columnName), paramName);
DbParameter parameter = command.CreateParameter();
parameter.Value = columnValue ?? DBNull.Value;
parameter.ParameterName = paramName;
command.Parameters.Add(parameter);
paramCount++;
}
foreach (var navigationProperty in entityTypeMapping.EntityType.NavigationProperties)
{
PropertyInfo propertyInfo = entityObject.GetType().GetProperty(navigationProperty.Name);
if (typeof(System.Collections.IEnumerable).IsAssignableFrom(propertyInfo.PropertyType))
continue;
AssociationSetMapping associationSetMapping = associationSetMappingCollection.First(a => a.AssociationSet.ElementType.FullName == navigationProperty.RelationshipType.FullName);
EndPropertyMapping propertyMappings = associationSetMapping.AssociationTypeMapping.MappingFragment.PropertyMappings.Cast<EndPropertyMapping>().First(p => p.AssociationEnd.Name.EndsWith("_Target"));
object relatedObject = propertyInfo.GetValue(entityObject, null);
foreach (ScalarPropertyMapping propertyMapping in propertyMappings.PropertyMappings)
{
string columnName = propertyMapping.Column.Name;
string paramName = string.Format("@p{0}", paramCount);
object columnValue = relatedObject == null ?
null :
relatedObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(relatedObject, null);
if (paramCount != 0)
sqlColumns += ",";
sqlColumns += string.Format("{0} = {1}", SqlQuote(columnName), paramName);
DbParameter parameter = command.CreateParameter();
parameter.Value = columnValue ?? DBNull.Value;
parameter.ParameterName = paramName;
command.Parameters.Add(parameter);
paramCount++;
}
}
string sqlWhere = string.Empty;
bool first = true;
foreach (EdmProperty keyProperty in entityTypeMapping.EntityType.KeyProperties)
{
var propertyMapping = mappingFragment.PropertyMappings.First(p => p.Property.Name == keyProperty.Name);
string columnName = ((ScalarPropertyMapping)propertyMapping).Column.Name;
object columnValue = entityObject.GetType().GetProperty(propertyMapping.Property.Name).GetValue(entityObject, null);
string paramName = string.Format("@p{0}", paramCount);
if (first)
first = false;
else
sqlWhere += " AND ";
sqlWhere += string.Format("{0} = {1}", SqlQuote(columnName), paramName);
DbParameter parameter = command.CreateParameter();
parameter.Value = columnValue;
parameter.ParameterName = paramName;
command.Parameters.Add(parameter);
paramCount++;
}
string sql = string.Format("UPDATE {0} SET {1} WHERE {2}", tableName, sqlColumns, sqlWhere);
command.CommandText = sql;
return command;
}
foreach (var user in users.ToList())
{
var statisticsService = new Instance<IStatisticsService>();
var statistic1 = GetStatistic(1); // this returns an object
var statistic 2 = GetStatistic(2);
statisticsService.Add(statistic1);
statisticsService.Add(statistic2);
statisticsService.Commit(); /* this is essentially a dbContext.SaveChanges(); */
}
// Easy to use
context.BulkSaveChanges();
// Easy to customize
context.BulkSaveChanges(bulk => bulk.BatchSize = 100);
// Perform Bulk Operations
context.BulkDelete(customers);
context.BulkInsert(customers);
context.BulkUpdate(customers);
// Customize Primary Key
context.BulkMerge(customers, operation => {
operation.ColumnPrimaryKeyExpression =
customer => customer.Code;
});