gpt4 book ai didi

c# - WCF 往返后 EF 中的 FK 出现问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:52:00 24 4
gpt4 key购买 nike

我正在开发一个包含服务器和客户端的分布式应用程序,其中服务器通过 WCF 公开服务。服务器使用 Entity Framework ,其各种方法返回 EntityObjects。

在客户端中,我没有对服务器的引用。所以在客户端中,类是完全生成的代理。

我在服务器中有一个删除方法。当我将一个对象(返回)传递给它进行删除时,它会这样做(去除异常处理等):

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。上面的代码抛出一个异常:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

但是,如果我删除一个没有以这种方式往返的实体,它会按预期工作:

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 NULLON CASCADE DELETE 工作得很好。

我已经在 Debug模式下检查了 carrier(实体)参数,但没能发现任何错误。具体来说,实体集合被填充,并包含相关对象。它看起来非常完整和正确,考虑到它已经被序列化,然后反序列化为代理类,反之亦然。但在某个地方,有些事情不太对劲。

我知道我也可以使用此方法签名并继续,或者甚至保留签名并使用 carrier 参数的 Id 属性代替 carrierId 参数。但我担心这将是许多问题中的第一个,因为整个方法有些不合理。

我可以尝试什么?例如,除了附加实体之外,还有什么我应该做的吗?

我应该提一下,我在这里使用的是 SQL Server Compact Edition v3.5,尽管在我看来这不是这个特定情况下的问题。

最佳答案

对于可能在这里遇到同样问题的任何人:我通过转到 self-tracking entities 解决了这个问题。 .这些是为往返而设计的,返回时更容易使用。检查一下。

关于c# - WCF 往返后 EF 中的 FK 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3617923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com