目前,我一直在使用位于服务外观下的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();
}
}
答案 0 :(得分:1)
然后,您需要在XML编辑器中编辑EDMX文件。也许自动更新一个表,DIFF EDMX文件以查看更改的内容,然后进入并编辑所有其他表。
如果您使用数据库优先方法,则重命名所有字段名称是一个大胆但有风险的举措。如果您具有这种灵活性,则最好将数据库中的字段重命名为更好的名称。
您将遇到的另一个问题是EF4将要复制您的实体名称,除非您要求不这样做。如果您确实将模型从EF1更新为EF4并让它复数化,请记住检查任何弱类型的Include()调用,并在修复它们时将它们更改为强类型.Include()中的一个。在网上找到。
答案 1 :(得分:0)
我遇到了同样的问题,这就是我最终修复模型的方法。
你应该能够重建你的关系。如果将其设置为多对一关系,则会启用“添加外键属性”复选框以启用,您可以检查它以创建将属性添加到实体。不要忘记修改名称。
您还可以通过双击图表中的行来访问关系详细信息。
请注意,创建的属性需要映射到数据库中的FK字段。