Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# 将实体框架1.0升级到4.0以包括外键_C#_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# 将实体框架1.0升级到4.0以包括外键

C# 将实体框架1.0升级到4.0以包括外键,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,目前,我一直在使用EntityFramework1.0,它位于一个服务界面之下 下面是我创建的用于更新或插入相关设备的保存方法之一 这目前是可行的,但我忍不住觉得,必须将引用的属性设置为null,然后重新附加它们以使插入生效,这有点像黑客。changedDevice已经保存了这些值,为什么我需要再次分配它们呢 所以,我想我会将模型更新为EF4。这样我就可以直接访问外键了。然而,在这样做时,我发现添加外键似乎不是一个简单的方法,除非从图中删除实体并重新添加它。我不想这样做,因为我已经通过了所有的实

目前,我一直在使用EntityFramework1.0,它位于一个服务界面之下

下面是我创建的用于更新或插入相关设备的保存方法之一

这目前是可行的,但我忍不住觉得,必须将引用的属性设置为null,然后重新附加它们以使插入生效,这有点像黑客。changedDevice已经保存了这些值,为什么我需要再次分配它们呢

所以,我想我会将模型更新为EF4。这样我就可以直接访问外键了。然而,在这样做时,我发现添加外键似乎不是一个简单的方法,除非从图中删除实体并重新添加它。我不想这样做,因为我已经通过了所有的实体属性从DB列名重命名它们。有人能帮忙吗

 /// <summary>
    /// Saves the non network device.
    /// </summary>
    /// <param name="nonNetworkDeviceDto">The non network device dto.</param>
    public void SaveNonNetworkDevice(NonNetworkDeviceDto nonNetworkDeviceDto)
    {
        using (var context = new AssetNetworkEntities2())
        {
            var changedDevice = TransformationHelper.ConvertNonNetworkDeviceDtoToEntity(nonNetworkDeviceDto);
            if (!nonNetworkDeviceDto.DeviceId.Equals(-1))
            {
                var originalDevice =
                context.NonNetworkDevices.Include("Status").Include("NonNetworkType").FirstOrDefault(
                  d => d.DeviceId.Equals(nonNetworkDeviceDto.DeviceId));
                context.ApplyAllReferencedPropertyChanges(originalDevice, changedDevice);
                context.ApplyCurrentValues(originalDevice.EntityKey.EntitySetName, changedDevice);
            }
            else
            {
                var maxNetworkDevice = context.NonNetworkDevices.OrderBy("it.DeviceId DESC").First();
                changedDevice.DeviceId = maxNetworkDevice.DeviceId + 1;
                var status = changedDevice.Status;
                var nonNetworkType = changedDevice.NonNetworkType;
                changedDevice.Status = null;
                changedDevice.NonNetworkType = null;
                context.AttachTo("DeviceStatuses", status);
                if (nonNetworkType != null)
                {
                    context.AttachTo("NonNetworkTypes", nonNetworkType);
                }

                changedDevice.Status = status;
                changedDevice.NonNetworkType = nonNetworkType;
                context.AddToNonNetworkDevices(changedDevice);
            }

            context.SaveChanges();
        }
    }
//
///保存非网络设备。
/// 
///非网络设备dto。
public void SaveNonNetworkDevice(非NetworkDeviceTo非NetworkDeviceTo)
{
使用(var context=new assetnetworkenties2())
{
var changedDevice=TransformationHelper.ConvertNonNetworkDeviceToEntity(NonNetworkDeviceToEntity);
如果(!NonNetworkDeviceTo.DeviceId.Equals(-1))
{
var原始设备=
context.NonNetworkDevices.Include(“Status”).Include(“NonNetworkType”).FirstOrDefault(
d=>d.DeviceId.Equals(非网络设备到.DeviceId));
context.ApplyAllReferencedPropertyChanges(原始设备、变更设备);
context.ApplyCurrentValues(originalDevice.EntityKey.EntitySetName,changedDevice);
}
其他的
{
var maxNetworkDevice=context.NonNetworkDevices.OrderBy(“it.DeviceId DESC”).First();
changedDevice.DeviceId=maxNetworkDevice.DeviceId+1;
var状态=变更设备状态;
var nonNetworkType=changedDevice.nonNetworkType;
changedDevice.Status=null;
changedDevice.NonNetworkType=null;
附件(“设备状态”,状态);
if(非网络类型!=null)
{
AttachTo(“非网络类型”,非网络类型);
}
changedDevice.Status=状态;
changedDevice.NonNetworkType=非NetworkType;
context.AddToNonNetworkDevices(changedDevice);
}
SaveChanges();
}
}

然后需要在XML编辑器中编辑EDMX文件。可能会自动更新一个表,区分EDMX文件以查看更改的内容,然后进入并编辑所有其他表

如果使用数据库优先的方法,重命名所有字段名是一个大胆但有风险的举动。如果您有这种灵活性,最好将数据库中的字段重命名为更好的名称


您将遇到的另一个问题是EF4将希望对实体名称进行复数化,除非您要求它不要这样做。如果您确实将模型从EF1更新为EF4,并让它将名称多元化,请记住检查任何弱类型的Include()调用,并在修复它们时将其更改为您可以在web上找到的许多强类型的.Include()调用之一。

我也遇到了同样的问题,这就是我最终修复模型的原因

你应该能够重建你的关系。如果将其设置为多对一关系,则会出现“将外键属性添加到已启用”复选框,您可以选中该复选框以创建“将属性添加到实体”。别忘了把名字改好

您还可以通过双击关系图中的行来访问关系详细信息


注意,创建的属性需要映射到DB中的FK字段。

谢谢Hightechrider,尽管我希望有更简单的方法!对于这个项目,我一直在努力学习EF1,并设法构建了一些扩展方法来完成我需要的任务。当您提到强类型包含时,您的意思是上面提到的这里描述的内容吗?我构建了一些扩展方法。我在博客中使用的过程是的,这是强类型Include选项之一。亚历克斯·詹姆斯还有一个。