Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保存具有多个父级的EF实例_C#_.net_Entity Framework_Entity Framework 6_Automapper - Fatal编程技术网

C# 保存具有多个父级的EF实例

C# 保存具有多个父级的EF实例,c#,.net,entity-framework,entity-framework-6,automapper,C#,.net,Entity Framework,Entity Framework 6,Automapper,当从业务逻辑对象映射回EF对象时,我遇到的主要问题之一是同一实例有两个父对象的情况: (对象为黄色,属性为橙色) 在业务逻辑世界中,这里只有树对象的一个实例(它显示为多个父对象的子对象:林和节) 当我使用AutoMapper将所有内容映射回EF对象时,EF认为有两个独立的树实例(尽管它们具有相同的ID)。因此,它会在数据库中创建一个副本 管理此场景的正确方法是什么,以使Forest和Section都指向数据库中相同的树记录 我们是否必须检查并手动确保所有可能被视为重复的内容都已附加?我认为,如

当从业务逻辑对象映射回EF对象时,我遇到的主要问题之一是同一实例有两个父对象的情况:

(对象为黄色,属性为橙色)

在业务逻辑世界中,这里只有树对象的一个实例(它显示为多个父对象的子对象:林和节)

当我使用AutoMapper将所有内容映射回EF对象时,EF认为有两个独立的树实例(尽管它们具有相同的ID)。因此,它会在数据库中创建一个副本

管理此场景的正确方法是什么,以使Forest和Section都指向数据库中相同的树记录


我们是否必须检查并手动确保所有可能被视为重复的内容都已附加?

我认为,如果您不想在此处重复,两个孩子不仅必须引用ID,而且必须引用内存中的特定实例,以便EF知道它应该是相同的记录(导航属性)。否则,您必须先保存父记录,然后在事件发生后将密钥分配给每个子项。如果这不是一个GUID,而是一个自动生成的ID,那么你可能需要使用相同的引用。

< P>不幸的EF需要得到一个相同的实例:<代码>树>代码>对象,在保存整个<代码>林< /Cord>图时(同样地,他的平等成员的重写没有帮助),同样地考虑他。这不是Automapper默认映射对象图的方式

但您可以按照映射期间重用现有实例的方式设置Automapper配置:

var config = new MapperConfiguration(cfg =>
{
   cfg.CreateMap<Tree, TreeEF>().PreserveReferences();
});

这将是理想的,但至少在我的情况下,这不是AutoMapper的工作方式。在映射之前,我已经确认了引用是相等的,但即使使用preserverences(),输出仍然会创建两个单独的实例,而以前只有一个实例。从我所看到的,AutoMapper无法确认在这种结构下引用是相同的。啊,我一定是在某处做了一些稍微不同的事情,或者EF以某种方式干扰-做得好!
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
{
}