C# EF DbContext.BulkInsert:找到不明确的匹配项
我正在处理EF扩展BulkInsert(MVC5,EF6)的奇怪问题 以下是我的代码结构: 我的数据库上下文继承自IdentityDbContext(我使用Owin) 实体接口C# EF DbContext.BulkInsert:找到不明确的匹配项,c#,asp.net-mvc,entity-framework,entity-framework-6,bulkinsert,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,Bulkinsert,我正在处理EF扩展BulkInsert(MVC5,EF6)的奇怪问题 以下是我的代码结构: 我的数据库上下文继承自IdentityDbContext(我使用Owin) 实体接口 public interface IMyObject { Guid Id { get; set; } } 基本实体对象 public class MyObject: IMyObject { [Key] public Guid Id {
public interface IMyObject
{
Guid Id { get; set; }
}
基本实体对象
public class MyObject: IMyObject
{
[Key]
public Guid Id
{
get
{
if (_id == Guid.Empty)
{
_id = Guid.NewGuid();
}
return _id;
}
set
{
_id = value;
}
}
private Guid _id;
public class Client : MyObject
{
[Required]
[StringLength(255)]
public string Name { get; set; }
public string Town{get;set;}
....
}
继承实体对象
public class MyObject: IMyObject
{
[Key]
public Guid Id
{
get
{
if (_id == Guid.Empty)
{
_id = Guid.NewGuid();
}
return _id;
}
set
{
_id = value;
}
}
private Guid _id;
public class Client : MyObject
{
[Required]
[StringLength(255)]
public string Name { get; set; }
public string Town{get;set;}
....
}
我正在尝试使用BulkInsert将大量客户端对象插入数据库:
private void InsertDataToDatabase<T>(ICollection<T> dbObjects) where T : class, IMyObject
{
MyContext.BulkInsert<T>(dbObjects, 5000);
//fails
}
private void InsertDataToDatabase(ICollection dbObjects),其中T:class,IMyObject
{
MyContext.BulkInsert(dbObjects,5000);
//失败
}
但是,这种标准插入方法效果良好:
private void InsertDataToDatabase<T>(ICollection<T> dbObjects) where T : class, IMyObject
{
foreach (var entity in dbObjects)
{
MyContext.Set<T>().Add(entity);
}
MyContext.SaveChanges();
//works fine
}
private void InsertDataToDatabase(ICollection dbObjects),其中T:class,IMyObject
{
foreach(dbObjects中的var实体)
{
MyContext.Set().Add(实体);
}
MyContext.SaveChanges();
//很好
}
BulkInsert中的例外是:
System.Reflection.AmbiguousMatchException:找到不明确的匹配。在
System.RuntimeType.GetPropertyImpl(字符串名称,BindingFlags
bindingAttr,Binder Binder,类型returnType,类型[]类型,
System.Type.GetProperty(字符串名称,
BindingFlags(bindingAttr)位于
EntityFramework.MappingAPI.Extensions.TypeExtensions.GetProperty(类型
中的类型、字符串属性名称、字符分隔符)
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\TypeExtensions.cs:line
79在
EntityFramework.MappingAPI.Mappers.MapperBase.MapProperty(EntityMap
entityMap、EdmProperty、Int32&i、字符串和前缀)
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs:line
488位于EntityFramework.MappingAPI.Mappers.MapperBase.MapEntity(字符串
输入完整名称,输入EdmType(项目)
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappers\MapperBase.cs:line
357位于EntityFramework.MappingAPI.Mappings.DbMapping..ctor(DbContext
(上下文)在
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Mappings\DbMapping.cs:line
82位于中的EntityFramework.MappingAPI.EfMap.Get(DbContext上下文)
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\EfMap.cs:line
60分
EntityFramework.MappingAPI.Extensions.MappingAPI Extensions.Db(DbContext
ctx,类型)输入
c:\dev\EntityFramework.MappingAPI\trunk\src\EntityFramework.MappingAPI\Extensions\MappingApiExtensions.cs:line
51在
System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable1
source,Func
2键选择器,Func2元素选择器,
IEqualityComparer
1比较器)位于
EntityFramework.BulkInsert.Helpers.MappedDataReader1..ctor(IEnumerable
1
可枚举,IEfBulkInsertProvider)中的
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Helpers\MappedDataReader.cs:line
58 at
EntityFramework.BulkInsert.Providers.EfSqlBulkInsertProviderWithMappedDataReader.Run[T](IEnumerable1)
中的实体、SqlTransaction事务、BulkInsertOptions选项)
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\EfSqlBulkInsertProviderWithMappedDataReader.cs:line
22时
EntityFramework.BulkInsert.Providers.ProviderBase
2.Run[T](IEnumerable1
中的实体、IDbTransaction事务、BulkInsertOptions选项)
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line
77 at
EntityFramework.BulkInsert.Providers.ProviderBase
2.Run[T](IEnumerable1
实体、BulkInsertOptions)中的
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Providers\ProviderBase.cs:line
105 at
EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext
上下文,IEnumerable
1实体,SqlBulkCopyOptions
sqlBulkCopyOptions,可为空1 batchSize)
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line
95分
EntityFramework.BulkInsert.Extensions.BulkInsertExtension.BulkInsert[T](DbContext
上下文,IEnumerable
1个实体,可空1个批大小)
c:\dev\EntityFramework.BulkInsert\dev\Src\EntityFramework.BulkInsert\Extensions\BulkInsertExtension.cs:line
75分
My.Portal.Controller.InstallController.InsertDataToDatabase[T](ICollection
1
对象)在
C:\xxxx\Controllers\InstallController.cs:line
581
请提供帮助。这是打字错误:
InsertDataToDatabase(ICollection对象)
和您使用的函数内部MyContext.BulkInsert(dbObjects,5000)代码>,objects参数和dbObjectshey,是,objects=dbobjects。修复了post.but错误,InsertDataToDatabase有两个参数,collection和guid,但您只提供了一个参数的声明。对不起,您能更具体一点吗?我不明白:(我明白你的意思,我修好了。不幸的是,这不是问题所在。只是忘了从日志中删除这个。