私が望むのは、オブジェクトの正確なコピーを作成することだけです。
クラスがあります
[Serializable]
public class Project
{
public int Id { get; set; }
public String Name { get; set; }
//navigational fields..
public virtual List<BusinessRequirement> BusinessRequirements { get; set; }
}
そしてもう一つ
[Serializable]
public class BusinessRequirement
{
public int Id { get; set; }
public String Name { get; set; }
public String Description { get; set; }
public virtual List<Project> Projects { get; set; }
}
そのため、どこかで多対多の関係を b/wProject
で構成し、次のBusinessRequirement
ようにしました。
HasMany(s => s.BusinessRequirements)
.WithMany(s => s.Projects)
.Map(m =>
{
m.MapLeftKey("ProjectId");
m.MapRightKey("BusinessRequirementId");
m.ToTable("ProjectBusinessRequirementMapping");
});
また、dbcontextを静的にしました。つまり
public static class DataLayer
{
public static MyDbContext db;
}
Project
今、私がしているのは、 ieのオブジェクトのコピーを作成しようとすることだけです
public Project Clone(Project source)
{
Project target = new Project();
target.Name = source.Name;
//1.
// target = source;
//2.
target.BusinessRequirements = new List<BusinessRequirement>();
foreach(BusinessRequirement br in source.BusinessRequirements)
{
BusinessRequirement nbr = DataLayer.Get<BusinessRequirement>(s=>s.Id=br.Id).SingleOrDefault();
if(nbr!=null)
target.BusinessRequirements.Add(nbr);
}
//3.
//target.BusinessRequirements = source.BusinessRequirements;
//4.
//target.BusinessRequirements = new List<BusinessRequirement>();
//foreach(BusinessRequirement br in source.BusinessRequirements)
//{
// BusinessRequirement nbr = br;
// if(nbr!=null)
// target.BusinessRequirements.Add(nbr);
//}
return target;
}
4 つの方法はどれも適切に機能しません。
動作に最も近いのは 2 ですが、奇妙なことが起こります。ここで、BusinessRequirements をOriginal Project
に追加すると、 にも追加さClonned One
れます。逆もまた同様で、削除も同様です。
どういうわけか、entityframework は両方のプロジェクトを 1 つとして扱っています。ただし、この動作は多対多の関連するナビゲーション プロパティでのみ発生します。
なぜEntityFrameworkはこのように振る舞うのですか???. 私は何が欠けていますか?助けてください..
ほぼ1日が経ちましたが、うまくいきません。