将Entity Framework 1.0升级到4.0以包含外键

时间:2010-04-27 11:13:03

标签: c# entity-framework entity-framework-4

目前,我一直在使用位于服务外观下的Entity Framework 1.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();
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我遇到了同样的问题,这就是我最终修复模型的方法。

你应该能够重建你的关系。如果将其设置为多对一关系,则会启用“添加外键属性”复选框以启用,您可以检查它以创建将属性添加到实体。不要忘记修改名称。

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

请注意,创建的属性需要映射到数据库中的FK字段。