[英]Saving an EF instance which has multiple parents
不幸的是,EF需要获取Tree
对象的相同实例,以便在保存整个Forest
图形时将其视为相同(覆盖其平等成员没有帮助),这不是Automapper默认情况下映射对象图形的方式。
但您可以按照映射期间重用现有实例的方式设置Automapper配置:
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Tree, TreeEF>().PreserveReferences();
});
如果你的bussines模型中的Forest
和Section
有一个对Tree
的同一个实例的子引用,那么这个引用将被保留,并且不会创建重复项。
编辑
class Program
{
static void Main(string[] args)
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<Forest, ForestEF>().PreserveReferences();
cfg.CreateMap<Section, SectionEF>().PreserveReferences();
cfg.CreateMap<Tree, TreeEF>().PreserveReferences();
});
var mapper = config.CreateMapper();
var forest = new Forest();
var section = new Section();
var tree = new Tree();
forest.Trees.Add(tree);
forest.Sections.Add(section);
section.Trees.Add(tree);
var result = mapper.Map<Forest, ForestEF>(forest);
Console.WriteLine(object.ReferenceEquals(result.Trees[0], result.Sections[0].Trees[0]));
Console.ReadLine();
}
}
public class Forest
{
public IList<Tree> Trees { get; set; } = new List<Tree>();
public IList<Section> Sections { get; set; } = new List<Section>();
}
public class Section
{
public IList<Tree> Trees { get; set; } = new List<Tree>();
}
public class Tree
{
}
public class ForestEF
{
public IList<TreeEF> Trees { get; set; } = new List<TreeEF>();
public IList<SectionEF> Sections { get; set; } = new List<SectionEF>();
}
public class SectionEF
{
public IList<TreeEF> Trees { get; set; } = new List<TreeEF>();
}
public class TreeEF
{
}
我相信如果你不想在这里重复,那么两个孩子不仅必须引用ID而且还要引用内存中的特定实例,因此EF知道它应该是相同的记录(导航属性)。 否则,您必须先保存父记录,然后在事后将密钥分配给每个子记录。 如果这不是GUID而是自动生成的id,那么您可能需要使用相同的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.