gpt4 book ai didi

c# - 无法确定 etaxiDataModel 关系的主体端。多个添加的实体可能具有相同的主键

转载 作者:行者123 更新时间:2023-11-30 13:02:32 25 4
gpt4 key购买 nike

Mapping definitions for SettlementShift我已经为这个问题苦苦挣扎了一段时间,但无法解决这个问题。已阅读多篇文章并尝试了几种不同的解决方案,但没有任何效果。现在我觉得我已经停下来了,真的需要帮助。

我将 EF 5+ 与 DB 优先和 edmx 文件一起使用。我的数据库中有 3 个不同的表:一、结算2.成本3. 转移

结算在我的 edmx 文件中有一个由 Association 连接的 Cost 和 Shift(带有链接表)的集合。

Settlement table with Link tables in my DB我需要在我的数据库中插入一个新的 Settlement,并引用一个已经存在的 Cost 和 Shift 集合。我试图插入的结算实体中包含的类次和成本包含所有相关数据,并且这些数据都没有以任何方式修改(与我从数据库中检索到的相同)。这是我将实体插入数据库的方法。

public bool CreateSettlement(Settlement settlement)
{
bool _success;

var _context = new EtaxiEnteties();// ObjectFactory.Get<IETaxiEntitiesContext>();

try
{
var _newSettlement = new Settlement
{
CreateDate = settlement.CreateDate,
Driver = settlement.Driver,
DriverID = settlement.DriverID,
Car = settlement.Car,
CarID = settlement.CarID,
DocPath = settlement.DocPath
};
foreach (var _shift in settlement.Shifts)
{
//var _sh = _context.Shifts.Find(_shift.ShiftID);
//_context.Entry(_sh).CurrentValues.SetValues(_shift);
_newSettlement.Shifts.Add(_shift);
}

foreach (var _cost in settlement.Costs)
{
////var _sh = _context.Costs.Find(_cost.CostID);
////_context.Entry(_sh).CurrentValues.SetValues(_cost);
_newSettlement.Costs.Add(_cost);
}
_context.Settlements.Add(_newSettlement);

_success = _context.SaveChanges() > 0;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return _success;
}

如能就此问题提供任何帮助,我们将不胜感激。

以下是我如何将 Cost 和 Shift 添加到我的集合中:

我在页面中创建一个 Settlement:

_settlement = new Settlement
{
CreateDate = DateTime.Now,
Driver = _driver,
DriverID = _driver.DriverID,
Car = _car,
CarID = _car.CarID,
DocPath = _path
};

然后当我创建一个包含来自 2 个单独的 GridView 的选定行的 pdf 文件时:

   foreach (GridDataItem _selectedRow in gwShifts.MasterTableView.Items)
{
if (_selectedRow.Selected)
{
var _shift =
_diaryRepository.GetShiftByID((int) _selectedRow.GetDataKeyValue("ShiftID")).FirstOrDefault();

if (_shift != null)
{
_settlement.Shifts.Add(_shift);
_settlementData.Shifts.Add(_shift);
_settlementData.SplitPercentace = GetTemplateValue(_selectedRow, "lblSplit");
_settlementData.SettlementAmount = GetTemplateValue(_selectedRow, "lblSettlementAmount");

if (_settlementData.Shifts != null)
{
_tableShifts.AddCell(
new PdfPCell(
new Phrase(
_settlementData.Shifts.FirstOrDefault().ShiftDate.ToShortDateString(),
_bodyFont)) {Border = 0});
_tableShifts.AddCell(
new PdfPCell(
new Phrase(
string.Format("{0:c}", _settlementData.Shifts.FirstOrDefault().GrossAmount),
_bodyFont)) {Border = 0});
_tableShifts.AddCell(
new PdfPCell(
new Phrase(
string.Format("{0:c}", _settlementData.Shifts.FirstOrDefault().MoneyAmount),
_bodyFont)) {Border = 0});
_tableShifts.AddCell(new PdfPCell(new Phrase(_settlementData.SplitPercentace, _bodyFont))
{Border = 0});
_tableShifts.AddCell(
new PdfPCell(new Phrase(_settlementData.SettlementAmount, _boldTableFont))
{Border = 0});

_totalAmount.AddRange(new[]
{
Convert.ToInt32(
_settlementData.SettlementAmount.Replace(".", "").
Replace(",", "").Replace("kr", ""))
});
_settlementData.Shifts.Remove(_shift);
}
}
}
}

var _summaryCell =
new PdfPCell(new Phrase("Upphæð: " + string.Format("{0:c}", _totalAmount.Sum()), _boldTableFont))
{
Border = 0,
Colspan = 5,
HorizontalAlignment = Element.ALIGN_RIGHT,
Padding = 5,
BorderWidthTop = 1
};
_tableShifts.AddCell(_summaryCell);

if (_totalAmount.Count != 0)
_totalAmount.Clear();
}

你可以看到我是如何将 Shift 添加到这个 Settlement 实体的:

     var _shift =
_diaryRepository.GetShiftByID((int) _selectedRow.GetDataKeyValue("ShiftID")).FirstOrDefault();

if (_shift != null)
{
_settlement.Shifts.Add(_shift);

然后我将它发送到 reporistory(见上面的方法)

        if(_driverRepository.CreateSettlement(_settlement))
{
SetMessage("Uppgjör hefur verið skapað og sent bílstjóra ef e-póstur er skráður á viðkomandi bílstjóra.", "Uppgjör skapað");
pnlSettlement.Visible = false;
pnlDocCreation.Visible = false;
pnlResult.Visible = false;
}

我也尝试简单地将参数结算直接添加到上下文中,但出现了类似的错误。

最佳答案

我认为这与您填充 ShiftsCosts 集合的方式有关。您正在尝试添加已创建的记录(即它们已经设置了主键值)以与新的 Settlement 实体一起保存,但我相信 Entity Framework 不会尝试创建新记录链接到您的新 Settlement 实体,而是将它们按原样保存到表中。在这种情况下,您确实会遇到多个实体具有相同主键的情况。

我会尝试以下操作(我将向您展示仅使用 Shifts 循环,但您也应该能够将其应用于 Costs 循环):

foreach (var _shift in settlement.Shifts)
{
var newShift = new Shift { /*Copy all of the values from _shift here*/ };
_newSettlement.Shifts.Add(_shift);
context.Shifts.Add(newShift);
}

如果这不起作用,我建议调试 CostsShifts 以确保您在这些集合中没有任何重复项。

关于c# - 无法确定 etaxiDataModel 关系的主体端。多个添加的实体可能具有相同的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15110757/

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