更新
抱歉,我错过了问题被标记为 EF4。这仅适用于 EF 更改其映射 API 的新版本。我把它留在这里是因为旧的 api 也可以做同样的事情,我可以在下班后找到这样做的代码
免责声明:我是 EFUtilities 的作者
EFUtilities https://github.com/MikaelEliasson/EntityFramework.Utilities 现在支持批量更新。开箱即用它不允许您执行合并部分。如果您有办法知道要插入哪些实体以及要更新哪些实体,您可以发出一个插入 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-insert-entities 和一个更新 https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-update-entities
如果您确实需要合并它可以帮助您构建表格。您可以通过此代码访问我在内部使用的元数据。
using (var db = new Context())
{
var mapping = EfMappingFactory.GetMappingsForContext(db);
var commentMapping = mapping.TypeMappings[typeof(Comment)];
}
typeMapping 包含我用于动态构建临时表以进行批量更新的所有信息。出于某种原因,我将该代码设为私有,但这是为表生成 sql 的方法。所有信息都在 typeMapping 上可用。
private string BuildCreateTableCommand(string schema, string tempTableName, IEnumerable<ColumnMapping> properties)
{
var pkConstraint = string.Join(", ", properties.Where(p => p.IsPrimaryKey).Select(c => "[" + c.NameInDatabase + "]"));
var columns = properties.Select(c => "[" + c.NameInDatabase + "] " + c.DataType);
var pk = properties.Where(p => p.IsPrimaryKey).Any() ? string.Format(", PRIMARY KEY ({0})", pkConstraint) : "";
var str = string.Format("CREATE TABLE {0}.[{1}]({2} {3})", schema, tempTableName, string.Join(", ", columns), pk);
return str;
}