首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Entity Framework -如果子重复项尚未被替换,则避免它们

Entity Framework -如果子重复项尚未被替换,则避免它们
EN

Stack Overflow用户
提问于 2011-07-23 02:19:56
回答 1查看 481关注 0票数 0

实际上我用的是DbContext,不过我也是用ObjectContext测试过的。

代码语言:javascript
复制
// Engine 1
Engine engine = new Engine();
Manufacturer manufacturer = new Manufacturer();

engine.Manufacturer = manufacturer;

// Engine 2
engine = new Engine();
engine.Manufacturer = manufacturer // Engine 2 has the same manufacturer like Engine 1

context.SaveChanges();

我使用identity列(int),在这里生成新的I。在调试模式下,我看到引擎的ID是"0“。好吧,如果我在引擎1块之后立即实现context.SaveChanges,那么新的制造商将被保存到DB中。使用EntityKey或任何检查,我可以将新制造商引用到Engine 2,而不会出现任何问题。但如果不立即使用SaveChanges(),则会将同一制造商的两个条目保存到DB中(上面的代码)。EF不能像普通对象那样在内部引用吗?正如你在上面看到的,制造商是同一个对象,所以我想知道是否有可能在不预先保存孩子/制造商的情况下获得成功的插入。

编辑:我想我找到了问题所在

代码语言:javascript
复制
MachineEntities context = new MachineEntities();
        context.Configuration.AutoDetectChangesEnabled = true;

        // Engine 1
        Engine engine1 = new Engine();
        engine1.Name = "engine1";

        Manufacturer manufacturer = new Manufacturer();
        manufacturer.Name = "manufacturer1";

        engine1.Manufacturer = manufacturer;

        // Engine 2
        Engine engine2 = new Engine();
        engine2.Name = "engine2";

        manufacturer = new Manufacturer();
        manufacturer.Name = "manufacturer1";

        engine2.Manufacturer = manufacturer;


        // Add Engine 1

        if (context.Manufacturers.Any(m => m.Name == engine1.Manufacturer.Name))
        {
            // The manufacturer's name is identical, so use the one in the context instead the assigned one.
            engine1.Manufacturer = context.Manufacturers.Single(m => m.Name == engine1.Manufacturer.Name);
        }
        else
        {
            // The manufacturer is not known, add it to the context
            context.Set<Manufacturer>().Add(engine1.Manufacturer);
        }

        // Add Engine 2


        if (context.Manufacturers.Any(m => m.Name == engine1.Manufacturer.Name))
        {
            // The manufacturer's name is identical, so use the one in the context instead the assigned one.
            engine2.Manufacturer = context.Manufacturers.Single(m => m.Name == engine2.Manufacturer.Name);
        }
        else
        {
            context.Manufacturers.Add(engine2.Manufacturer);
        }

        context.SaveChanges();

        context.Dispose();

" any“或任何比较都不会给出任何结果。它只给我那些已经在数据库中持久化的实体,而不是新添加的实体。所以它是复制的。正如我在调试器中看到的那样,本地变量被忽略,而“结果视图”中的变量就是执行命令的位置。因此新添加的实体位于"Manufacturers.Local“中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-23 02:52:50

我刚刚尝试了以下几种方法:

代码语言:javascript
复制
var a1 = new Activity{WorkflowId = 1, Title = "test"};
var a2 = new Activity{WorkflowId = 1, Title = "test2"};
var d = new WorkflowDisplay{WorkflowId = 1, Title = "Test"};
a1.WorkflowDisplay = d;
a2.WorkflowDisplay = d;
// Any of the next three lines can be commented out, but if
// they are all commented, nothing happens.
AddToWorkflowDisplays(d);
AddToActivities(a1);
AddToActivities(a2);
SaveChanges();

..。我只看到添加了一个WorkflowDisplay。因此,我非常确定这与您的特定实现有关。您是否覆盖了任何实体的GetHashCodeEquals方法,或者对自动生成的代码进行了任何类似的自定义?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6794382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档