C# WCF往返后EF中的FK故障
我正在开发一个带有服务器和客户端的分布式应用程序,其中服务器通过WCF公开服务。服务器使用实体框架,其各种方法返回EntityObjects 在客户端中,我没有对服务器的引用。因此,在客户机中,类是完全生成的代理 我在服务器中有一个delete方法。当我将一个对象传回给它进行删除时,它会执行以下操作,包括异常处理等:C# WCF往返后EF中的FK故障,c#,.net,wcf,entity-framework,entity-framework-4,C#,.net,Wcf,Entity Framework,Entity Framework 4,我正在开发一个带有服务器和客户端的分布式应用程序,其中服务器通过WCF公开服务。服务器使用实体框架,其各种方法返回EntityObjects 在客户端中,我没有对服务器的引用。因此,在客户机中,类是完全生成的代理 我在服务器中有一个delete方法。当我将一个对象传回给它进行删除时,它会执行以下操作,包括异常处理等: public void DeleteCarrier(CarrierDefinition carrier) { var container = new WsaEntities
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的外键。其中一个FK可使用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();
}
在这里,ON CASCADE SET NULL和ON CASCADE DELETE工作得很好
我在调试模式下检查了carrier实体参数,没有发现任何错误。具体而言,将填充实体集合,并包含相关对象。考虑到它已经被序列化,然后反序列化为代理类,反之亦然,它看起来非常完整和正确。但在某个地方,有些事情不太对劲
我知道我也可以使用这个方法签名并继续,甚至可以保留签名并使用carrier参数的Id属性代替carrierId参数。但我担心这将是许多问题中的第一个,因为整个方法有些不健全
我能试试什么?例如,除了附加实体之外,还有什么我应该做的吗
我应该提到的是,我在这里使用的是SQL Server Compact Edition v3.5,尽管在我看来这并不是这个特殊情况下的问题。对于在座的任何一位可能遇到同样问题的人来说:我通过移动到解决了这个问题。这些是为往返而设计的,并且在返回时更容易使用。看看吧。对于在座的任何一位可能有同样问题的人来说:我通过迁移到解决了这个问题。这些是为往返而设计的,并且在返回时更容易使用。看看吧