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

我有一个名为“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 的正确解决方案。


猛跑小猪
浏览 150回答 1
1回答

侃侃无极

“首先,我看不到为“DocumentLine”类型的实例设置外键的位置。”好吧,首先-检查一下。在 EF 创建的实际数据库中。你很可能会DocumentId在你的DocumentLines桌子上找到一个 FK 。您Document和DocumentLines处于一对多关系中 - 如果DocumentLine没有 aDocument作为父母,a毫无意义。因此,您不能将孤立对象插入DocumentLine数据库。取消注释public virtual Document ParentDocument { get; set; }并在插入之前分配父级:public async Task<DocumentLine> CreateNewAsync(Document parent){&nbsp; &nbsp; try&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DocumentLine documentLine = new DocumentLine();&nbsp; &nbsp; &nbsp; &nbsp; documentLine.ParentDocument = parent;&nbsp; &nbsp; &nbsp; &nbsp; var newDocumentLine = await databaseContext.DocumentLines.AddAsync(documentLine);&nbsp; &nbsp; &nbsp; &nbsp; await databaseContext.SaveChangesAsync();&nbsp; &nbsp; &nbsp; &nbsp; return newDocumentLine.Entity;&nbsp; &nbsp; }&nbsp; &nbsp; catch(Exception ex)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }}这告诉 EntityFramework “嘿,这两个是相关的。” 然后,EF 将自行在数据库中找出正确的关系值。告诉我它是否解决了问题,因为一切都取决于 FK on 的初始猜测DocumentId。
打开App,查看更多内容
随时随地看视频慕课网APP