为了账号安全,请及时绑定邮箱和手机立即绑定

将子实体添加到数据库并将它们分配给数据库 Entity Framework Core 中的父对象

将子实体添加到数据库并将它们分配给数据库 Entity Framework Core 中的父对象

C#
猛跑小猪 2022-01-09 15:01:15
我有一个名为“Document”的数据模型,如下所示:public class Document{    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public int Id { get; set; }    //[ForeignKey("Id")]    public List<DocumentLine> Lines { get; set; }    public DateTime PurchaseDate { get; set; }    public double TotalValue { get; set; }}它包含一个子对象“DocumentLines”的列表,如下所示:public class DocumentLine{    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]    public int Id { get; set; }    public int LineId { get; set; }    public int DocumentId { get; set; }    //public virtual Document ParentDocument { get; set; }    public string ItemName { get; set; }    public double ItemPrice { get; set; }    public double ItemId { get; set; }    public int Quantity { get; set; }}我为解决方案中的每个 DataModel 创建了一个存储库,因此我有一个 documentRepository 和一个 documentLinesRepository。目前,我在创建一个包含其子 documentLines 列表的新文档时遇到了几个错误。如果我想在数据库中创建一个新文档,首先执行以下代码:    public async Task<Document> CreateNewAsync()    {        Document document = new Document()        {            Lines = null,            PurchaseDate = DateTime.Now,        };        var newDocument = await databaseContext.Documents.AddAsync(document);        await databaseContext.SaveChangesAsync();        return newDocument.Entity;    }这段代码可以正常工作,但是现在如果我想创建一个 DocumentLine 类型的新对象并使用以下代码将其添加到数据库中:我在应将“documentLine”添加到数据库的行中收到以下错误:“SQLite 错误 19:‘外键约束失败’。”首先,我看不到为“DocumentLine”类型的实例设置外键的位置。我尝试了其他几件事,以及在每个 DocumentLine 中分配了一个类型为“Document”的父级实例,但这也给了我一个错误。它应该如何工作我的问题是如何正确实现将文档保存在数据库中并且每行单独保存(来自 documentLinesRepository)的行为,并且仅在设置所有行的最后,文档将在包含DocumentLines 对象的完整列表。如果这是一个初学者问题,请提前抱歉,但直到现在我尝试解决这个错误几天,但我没有找到谷歌 atm 的正确解决方案。
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

“首先,我看不到为“DocumentLine”类型的实例设置外键的位置。”


好吧,首先-检查一下。在 EF 创建的实际数据库中。你很可能会DocumentId在你的DocumentLines桌子上找到一个 FK 。


您Document和DocumentLines处于一对多关系中 - 如果DocumentLine没有 aDocument作为父母,a毫无意义。因此,您不能将孤立对象插入DocumentLine数据库。取消注释


public virtual Document ParentDocument { get; set; }

并在插入之前分配父级:


public async Task<DocumentLine> CreateNewAsync(Document parent)

{

    try

    {

        DocumentLine documentLine = new DocumentLine();


        documentLine.ParentDocument = parent;


        var newDocumentLine = await databaseContext.DocumentLines.AddAsync(documentLine);

        await databaseContext.SaveChangesAsync();

        return newDocumentLine.Entity;

    }

    catch(Exception ex)

    {

        return null;

    }

}

这告诉 EntityFramework “嘿,这两个是相关的。” 然后,EF 将自行在数据库中找出正确的关系值。


告诉我它是否解决了问题,因为一切都取决于 FK on 的初始猜测DocumentId。


查看完整回答
反对 回复 2022-01-09
  • 1 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信