我需要一次添加许多实体。这并不复杂:
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
答案 0 :(得分:1)
您可以仅使用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。
答案 1 :(得分: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]