2

我需要一次添加许多实体。这并不复杂:

EntityType entities = GetEntities();
dbContext.MyTable.AddRange(entities);

但是,每个实体都引用了另一个子属性(它已经存在,并且我知道它的 id)。有没有一种有效的方法可以避免提前查询所有子属性?

for (int i = 0; i < entities.Length; i++)
{
    // adding already existing property 
    entities[i].MyProperty = new MyProperty { Id = ExternalIds[i] };
}

dbContext.MyTable.AddRange(entities); // Don't want to create new entities
4

2 回答 2

2

您可以仅使用 id 创建空实体对象,也可以将属性键添加到实体

public class Course
{
  public int CourseID { get; set; }
  public string Title { get; set; }
  public int Credits { get; set; }
  public int DepartmentID { get; set; }
  public virtual Department Department { get; set; }
}

在这里,您可以只输入 DepartmentID 值并保存,或者

Course.Department = new Department{ id = 123 }

文档

如果引用处于添加状态(在此示例中为课程对象),则在调用 SaveChanges 之前,引用导航属性不会与新对象的键值同步。

于 2018-09-25T16:04:02.407 回答
0

两种解决方案,首先您可以手动附加相关实体对象,以便在添加目标实体对象之前以未更改的状态对其进行跟踪:

var myProps = ExternalIds
    .Select( id => new MyProperty { Id = id } )
    .ToArray();

dbContext.AttachRange( myProps ); // tracks as Unchanged

...
entities[ i ].MyProperty = myProps[i];

或者为 nav 属性公开 FK 属性并简单地设置 ID(如果您使用 FK 值,这是我的首选解决方案)

public class EntityType
{
    ...
    public int MyPropertyId { get; set; }
    [ForeignKey( "MyPropertyId" )]
    public MyProperty MyProperty { get; set; }
}

...
Entities[i].MyPropertyId = ExternalIds[i]
于 2018-09-25T16:12:45.190 回答