实体框架添加了许多实体,嵌套属性已经存在

时间:2018-09-25 13:11:20

标签: c# entity-framework

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

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

2 个答案:

答案 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 }

docs says

  

如果参考处于添加状态(在此示例中,课程   对象),则参考导航属性将不会同步   带有新对象的键值,直到调用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]