【发布时间】:2014-04-19 10:13:38
【问题描述】:
在添加多个订单实体后尝试在上下文中保存更改()时出现以下错误:
操作失败:无法更改关系,因为 一个或多个外键属性不可为空。当一个 对关系进行更改,相关的外键属性是 设置为空值。如果外键不支持空值, 必须定义一个新的关系,外键属性必须是 分配了另一个非空值,或者不相关的对象必须是 已删除。
现在我知道错误的含义了,而且我已经搜索了很多信息。问题是,我不会删除任何东西或覆盖任何东西(据我所知)。
我在从亚马逊导入订单时在我的主应用程序中遇到了这个错误,因此我将代码剥离到控制台应用程序中以尝试缩小范围,但到目前为止还没有成功。
控制台应用程序现在正在做我能想到的最低限度的重新创建错误 - 只需创建两个测试订单并调用 Save。现在有趣的是 两个 测试命令 - 不是一个。如果我只添加一个订单并调用 Save,我不会收到错误 - 只有当我将多个订单添加到实体列表时才会发生这种情况。
(现在我可以在每次添加之后调用 Save(),但是要导入很多订单,这会慢一些。此外,我想深入了解一下 - 它曾经工作过)
我正在考虑我最近对应用程序所做的更改可能会导致此问题 - 有一个更改,但我正在努力思考可能导致此问题的方式。
以前,每个 Order 记录都与名为 Payments 的表有一个(可为空的)关系。我从模型中删除了该表(和关系)并创建了一个类似的表和关系,称为 Receipts。 (想法是每个订单都将有零个或一个收据实体与之关联)。
添加的测试订单没有收据(根据模型,这是有效的 - ReceiptId 可以为空),我在任何地方都找不到旧 Payments 表的任何痕迹。
如果有办法找出此错误所抱怨的关系,以便我可以进一步缩小范围?
private static void Main(string[] args)
{
var unitOfWork = new UnitOfWork();
var orders = GetOrders(unitOfWork);
foreach (var order in orders)
{
unitOfWork.OrdersRepository.AddOrder(order);
}
unitOfWork.Save();
Console.WriteLine("Done.");
Console.ReadLine();
}
private static IEnumerable<Order> GetOrders(IUnitOfWork unitOfWork)
{
// Use defaults
var country = unitOfWork.CountriesRepository.GetCountryById(223);
var source = unitOfWork.OrderSourceRepository.GetSourceById("AMZ");
var impression = unitOfWork.PostageImpressionRepository.GetPostageImpressionById(1);
for (var i = 0; i < 2; i++)
{
yield return
new Order
{
Address1 = "Address 1",
Address2 = "Address 2",
Address3 = "Address 3",
Town = "Town ",
County = "County",
EMail = "test@test.com",
ExternalOrderRef = "Ref",
FullName = "Test Order " + i,
OrderDate = DateTime.Now,
OrderSource = source,
Postcode = "AA11AA",
Telephone = "0123456789",
ExternalStatus = "New",
Total = 1.23m,
Paid = true,
PaidDate = DateTime.Now,
ShippedDate = null,
Cancelled = false,
Country = country,
Receipt = null,
PostageImpression = impression,
SubTotal = 1.23m,
PostageCost = 0.00m
};
}
}
【问题讨论】:
-
测试控制台应用程序的代码草图可能有助于缩小问题范围。
标签: c# sql entity-framework