Для сущностей, которые содержат коллекции других сущностей, вы должны инициализировать эти коллекции при построении:
public class EntityEnviroment
{
[Key]
public virtual int env_id { get; set; }
public virtual string env_name { get; set; }
public virtual string env_country { get; set; }
public virtual ICollection<StcEntityFailedReportDetail> failedReportDetails { get; set; } = new List<StcEntityFailedReportDetail>();
}
Таким образом, вы можете использовать эти коллекции на новых сущностях прямо из ворот.В любом месте вашего кода, который «устанавливает» коллекцию, должна быть помечена для расследования.Это не способ очистить коллекцию из вашей БД, например, так что если где-либо, кроме этого (или конструктор), возникает = new List<TEntity>()
, что является проблемой.
var entryDetail = new EntityFailedReportDetail();
foreach (var value in result.failed_report_details)
{
entryDetail.report_id = value.report_id;
entryDetail.report_status = value.report_status;
db.StcEntityFailedReportDetails.Add(entryDetail);
}
Ваша проблема с этим кодомчто вы инициализируете 1 «детальную» запись, затем в цикле обновляете ее детали и пытаетесь «добавить» ее в DbSet.Это одна ссылка.
Тогда этот код:
failedReportDetails = new List<EntityFailedReportDetail> { entryDetail }
Просто инициализирует коллекцию этой ссылкой с последней добавленной вами деталью.
Настройка вашего примера:
using (var db = new StatusPlatformContext())
{
var entry = new EntityEnviroment
{
env_name = result.environment_status.env_name,
env_country = "Ger",
};
foreach (var value in result.failed_report_details)
{
var entryDetail = new EntityFailedReportDetail
{
report_id = value.report_id,
report_status = value.report_status,
EntityEnvironment = entry
};
entry.failedReportDetails.Add(entryDetail);
}
db.EntityEnviromentStat.Add(entry);
db.SaveChanges();
}
Вам не нужно явно добавлять каждую деталь в DbSet-набор деталей контекста, и если вам не нужно запрашивать детали вне записи, ваш контекст даже не нуждается вНабор деталей.EF будет управлять связанными сущностями, поэтому вам нужны только DbSets для сущностей «верхнего уровня», в основном родительских сущностей, на которые ваша система ссылается индивидуально.Вы всегда можете запросить связанные сущности через их родителей.