实际上我用的是DbContext,不过我也是用ObjectContext测试过的。
// 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不能像普通对象那样在内部引用吗?正如你在上面看到的,制造商是同一个对象,所以我想知道是否有可能在不预先保存孩子/制造商的情况下获得成功的插入。
编辑:我想我找到了问题所在
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“中。
发布于 2011-07-23 02:52:50
我刚刚尝试了以下几种方法:
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。因此,我非常确定这与您的特定实现有关。您是否覆盖了任何实体的GetHashCode或Equals方法,或者对自动生成的代码进行了任何类似的自定义?
https://stackoverflow.com/questions/6794382
复制相似问题