我的應用程序讀取XML文件,並創建一個PatientDto
,我的方法CreatePatient(PatientDto patient)
管理分離的實體與實體框架
這種方法映射的PatientDto
到Patient
與實體框架將其存儲使用。通過映射,我的意思是創建一個新的Patient
與這名患者被寫如下的PatientDto
值:
public class PatientDto
{
public string Name { get; set; }
public IEnumerable<DietDto> Diets { get; set; }
}
internal class Patient
{
public Patient(PatientDto dto)
{
this.Name = dto.Name;
this.Diets = this.BuildDiets(dto.Diets);
}
public string Name { get; set; }
public IEnumerable<Diet> Diets { get; set; }
}
一個Diet
有Week
列表,有Day
列表,具有列表Meal
,它有一個Ingredient
的列表。
當我創建新的患者,圖形的所有對象都是新的(這是他們應該被存儲在數據庫中)但的成分。成分已經存在於數據庫中。
由於映射,所有的成分都是不同的實例(即使它們具有相同的業務含義,這是具有相同ID的兩種成分具有不同實例)。
當我執行我的代碼,我有一個例外:
A duplicate value cannot be inserted into a unique index. [ Table name = Ingredients,Constraint name = PK_dbo.Ingredients ]
速戰速決,我發現這是一個:
foreach (var diet in patient.Diets)
foreach (var week in diet.Weeks)
foreach (var day in week.Days)
foreach (var recipe in day.Meals)
for (int i = 0; i < recipe.Recipe.Ingredients.Count; i++)
{
recipe.Recipe.Ingredients[i] = (from igt in this.Context.Ingredients
where igt.Id == recipe.Recipe.Ingredients[i].Id
select igt).Single();
}
但是,這不是真正可讀一個循環中的一個循環,在...中不是我所稱的優化代碼。
有沒有其他的方法可以正確地做到這一點?