Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# WCF往返后EF中的FK故障_C#_.net_Wcf_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# WCF往返后EF中的FK故障

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

我正在开发一个带有服务器和客户端的分布式应用程序,其中服务器通过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的外键。其中一个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,尽管在我看来这并不是这个特殊情况下的问题。

对于在座的任何一位可能遇到同样问题的人来说:我通过移动到解决了这个问题。这些是为往返而设计的,并且在返回时更容易使用。看看吧。

对于在座的任何一位可能有同样问题的人来说:我通过迁移到解决了这个问题。这些是为往返而设计的,并且在返回时更容易使用。看看吧