Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有一对一关系的EFCore BulkInsert_C#_.net_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# 具有一对一关系的EFCore BulkInsert

C# 具有一对一关系的EFCore BulkInsert,c#,.net,sql-server,asp.net-core,entity-framework-core,C#,.net,Sql Server,Asp.net Core,Entity Framework Core,我正在尝试使用.NETCore2.1中EFCore.BulkExtensions中的bulkinsert,并使用一对一关系。我有2个数据库实体 public partial class Entity1 { public int ID { get; set; } public virtual Entity2 Entity2Obj { get; set; } } public partial class Entity2 { public int ID { get; set

我正在尝试使用.NETCore2.1中EFCore.BulkExtensions中的bulkinsert,并使用一对一关系。我有2个数据库实体

public partial class Entity1
{
    public int ID { get; set; }
    public virtual Entity2 Entity2Obj { get; set; }
}

public partial class Entity2 
{
    public int ID { get; set; }
    public int Entity1_ID{ get; set; }
    public virtual Entity1 Entity1Obj { get; set; }
}
然后我插入Entity1项的列表

 _context.BulkInsert(Entity1ItemsList);
这仅适用于在我的数据库中插入Entity1对象。未插入关联的Entity2项。有没有办法做到这一点

导航属性在Scaffold DbContext期间自动创建(数据库优先)

entity.HasOne(d=>d.Entity1)
.WithOne(p=>p.Entity2)
.HasForeignKey(d=>d.Entity1\u ID)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName(“FK_实体1_实体2”);

这可能是您正在寻找的,因为您还希望插入子属性

context.BulkInsert(Entity1ItemsList,options=>options.IncludeGraph=true)


您可以进一步阅读:

在四处搜索后,我想我找到了解决方案。首先,设置以下配置

var bulkConfig = new BulkConfig()
{
    SetOutputIdentity = true,
    PreserveInsertOrder = true
};
运行初始bulkconfig以插入Entitys1List并从SQL Server获取唯一ID

_context.BulkInsert(Entity1ItemsList, bulkConfig);
现在指定了唯一的主键,以便将其值设置为相关实体使用

foreach (var item in Entity1ItemsList)
{
    item.Entity2Obj.Entity1_ID = item.ID;
}
这将设置正确的外键值。然后我插入Entities2列表

var Entities2List = Entity1ItemsList.Select(u => u.Entity2Obj).ToList();
 _context.BulkInsert(Entities2List);

我希望通过只使用一个BulkInsert来实现更简单的功能,它将自动添加所有导航属性,而不是2个。但这是有效的,而且速度很快

您是否为
Entity2Obj
的每个
Entity1ItemsList
项目设置了数据?这里有一条经验法则:确保在
Entity1
Entity2
之间正确配置了您的关系。。。这可能意味着使用FluentAPi配置它们,因为您有导航属性。。。其次,确保
Entity1ItemsList
ave数据传递给
Entity2Obj
Yes,Entity1ItemsList中的每个Entity2Obj项都有数据。关系是在Scaffold DbContext期间自动设置的,因为它首先是数据库。如果使用context.SaveChanges()为Entity1ItemsList的每个项目使用context.Add(),则导航属性将成功填充。因此,我认为这些关系配置正确。它不仅适用于bulkinsert。按照惯例,这些关系是自动的,但情况并非总是如此。尤其是在意识到您的
Entity2
没有导航属性返回到
Entity1
之后。您可以添加
IncludeGraph
选项并将其设置为true吗。。。请参阅下面的答案。我没有使用此插件。我用的是这里的,因为你用的不是免费的!因此,我无法使用IncludeGraph,因为它不可用。我还编辑了我的问题,将属性返回到实体,因为我忘了提及itAny更新?EF core做到了开箱即用我发现的唯一一种仍然在使用的工作方式是我提到的,在一个使用entity framework 6.2.0和Taneryd.Bulkoperation.EF6的c#Asp.net mvc项目中。如果我将项目迁移到asp.net Core,我会按照EF Core的方式(正如您所提到的),我认为这是一个更好的解决方案
var Entities2List = Entity1ItemsList.Select(u => u.Entity2Obj).ToList();
 _context.BulkInsert(Entities2List);