代码之家  ›  专栏  ›  技术社区  ›  Tor Haugen

WCF往返后EF中FK出现故障

  •  2
  • Tor Haugen  · 技术社区  · 14 年前

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

    1 回复  |  直到 11 年前
        1
  •  0
  •   Tor Haugen    14 年前

    self-tracking entities . 这些都是为往返,更容易工作时返回。过来看。