Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Wcf 实体框架保存多对多映射_Wcf_Entity Framework_C# 4.0_Entity Framework 4_Entity - Fatal编程技术网

Wcf 实体框架保存多对多映射

Wcf 实体框架保存多对多映射,wcf,entity-framework,c#-4.0,entity-framework-4,entity,Wcf,Entity Framework,C# 4.0,Entity Framework 4,Entity,我对实体框架(4)有些陌生,我有一个特别的场景让我感到困惑。我有两个基本实体:圆柱体和位置。两者之间有一个多对多映射表。换句话说,一个圆柱体有一组位置,一个位置有一组圆柱体 我使用整数ID作为圆柱体和位置的主键 这些实体作为两个集合(圆柱体和位置)从同一上下文中检索,并在客户端上进行编辑。编辑圆柱体。位置[0]将更改“位置”集合中的相应位置,即它是同一对象 现在,当需要在服务器上保存时,我的“更新”方法将获取一个圆柱体列表和一个位置列表。单独保存气缸和位置是很简单的 更新: 我的初步做法如下:

我对实体框架(4)有些陌生,我有一个特别的场景让我感到困惑。我有两个基本实体:
圆柱体
位置
。两者之间有一个多对多映射表。换句话说,一个圆柱体有一组位置,一个位置有一组圆柱体

我使用整数ID作为圆柱体和位置的主键

这些实体作为两个集合(圆柱体和位置)从同一上下文中检索,并在客户端上进行编辑。编辑
圆柱体。位置[0]
将更改“位置”集合中的相应位置,即它是同一对象

现在,当需要在服务器上保存时,我的“更新”方法将获取一个圆柱体列表和一个位置列表。单独保存气缸和位置是很简单的

更新:

我的初步做法如下:

//保存位置

foreach (var cylinderLocation in cylinderLocations)
{
    if (cylinderLocation.ChangeTracker.State == ObjectState.Added)
        cylinderLocation.Insert();
    else if (cylinderLocation.IsDirty)
        cylinderLocation.Update();
}
//CylinderLocation.Insert()如下所示:

public static void Insert(this CylinderLocation cylinderLocation)
{
    using (var context = new CylinderManagementModelContainer(GetConnectionString()))
    {
        if (cylinderLocation.Cylinder != null)
            cylinderLocation.Cylinder.ModifiedTimeStamp = DateTime.Now;

        cylinderLocation.ModifiedTimeStamp = DateTime.Now;

        context.CylinderLocations.AddObject(cylinderLocation);

        context.SaveChanges();
     }
}
更新: CylinderLocation Insert()保存CylinderLocation和圆柱体(如果已映射);但是,当执行saveCyclares步骤(如下)时,它仍然认为有一个Id为0的新圆柱体。换句话说,圆柱体[0]。Id=0,但位置[0]。圆柱体[0]。Id>0

//保存气缸

foreach (var cylinder in cylinders)
{
    if (cylinder.ChangeTracker.State == ObjectState.Added)
        cylinder.Insert();
    else if (cylinder.IsDirty)
        cylinder.Update();
}
但是,当我试图保存一个新圆柱体和一个新位置时,事情会变得混乱,它们都需要相互映射。换句话说,
Cylinder.Id=0
Location.Id=0
,它们都需要保存并相互映射

我希望我可以在保存后更新ID(即使用更改的属性并更新原始实体);但是,似乎一旦实体序列化到服务器,
Cylinder.Location[0]
就不再是Locations集合中的同一个对象,即它是一个不同的实例。所以Id更新不起作用

我愿意接受任何建议


谢谢。

如果您将密钥设置为使用存储生成的值,则基本上应该是自动的。但是您在问题中没有说明您是如何配置的,因此关于您使用的数据库以及如何生成ID的详细信息将非常有用。正确。圆柱体和位置上的StoreGeneratedPattern都设置为Identity。Id正在正确更新,但仅在每个实体中分别更新。换句话说,位置.Cylinder[0].Id仍然设置为0,即使保存了圆柱体[0]并更新了Id。保存位置应自动保存相关圆柱体,然后重试。正在更新进程中的ID。您可能需要显示代码。谢谢您的帮助。我确信问题在于我的方法。我尝试了几个不同的想法。。。我忘了提到我正在使用STE(如果有区别的话)。最初,我使用的是ApplyChanges扩展方法,但遇到了问题。从客户端,用户可以有选择地包括/排除要保存的圆柱体/位置。ApplyChanges引入了问题,因为它可以通过以下引用“复活”用户不打算保存的实体。尽管如此,我还是更新了我的原始帖子,加入了最新的方法。是的,STEs确实起到了作用。不确定修复是什么(我不使用STE),但我打赌您需要在保存后手动刷新位置,然后自己修复它们。