我正在开发一个带有服务器和客户端的分布式应用程序,其中服务器通过WCF公开服务。服务器使用实体框架,其各种方法返回EntityObjects。
在客户机中,我没有对服务器的引用。所以在客户机中,类是完全生成的代理。
我在服务器中有一个delete方法。当我传递一个对象(返回)给它进行删除时,它会这样做(去掉异常处理等):
public void DeleteCarrier(CarrierDefinition carrier)
{
var container = new WsaEntities();
if (carrier.EntityState == EntityState.Detached)
{
container.CarrierDefinitions.Attach(carrier);
}
container.CarrierDefinitions.DeleteObject(carrier);
container.SaveChanges();
}
另外两个表具有CarrierDefinition的外键。其中一个FKs可以使用
ON CASCADE SET NULL
CASCADE DELETE
. 上面的代码引发了一个异常:
操作失败:关系
无法更改,因为一个或多个
不可为空。当更改
一段关系,相关的
价值观。如果外键不存在
支持空值,一个新的
必须指定外键属性
另一个非空值,或
但是,如果我删除了一个没有以这种方式往返的实体,它将按预期工作:
public void DeleteCarrier(Guid carrierId)
{
var container = new WsaEntities();
var c = container.CarrierDefinitions.Where(cd => cd.Id == carrierId).First();
container.CarrierDefinitions.DeleteObject(c);
container.SaveChanges();
}
这里,那个
关于级联集NULL
ON CASCADE DELETE
很好用。
我知道我也可以使用这个方法签名并继续,甚至可以保留签名并使用carrier参数的Id属性来代替carrierId参数。但我担心这将是许多问题中的第一个,因为整个方法有些不健全。
我能试试什么?例如,除了附加实体之外,还有什么我应该做的吗?
我应该提到的是,我在这里使用的是sqlservercompacteditionv3.5,尽管在我看来这并不是这个特殊情况下的问题所在。