简体   繁体   English

在 EntityFramework 中的现有行上更新或添加子记录

[英]Updating or Adding a Child Record on an Existing Row in EntityFramework

I have an existing row in SQL called OrderLine.我在 SQL 中有一个名为 OrderLine 的现有行。 This links (but does not have to) OrderLineCustomFields.此链接(但不是必须)OrderLineCustomFields。 An OrderLine can be inserted with no OrderLineCustomFields object but could have OrderLineCustomFields at a later date.可以在没有 OrderLineCustomFields 对象的情况下插入 OrderLine,但可以在以后插入 OrderLineCustomFields。 I don't receive any errors but when the OrderLine is saved, the generated column (OrderLineCustomFields_OrderLineCustomFieldsId) doesn't get stamped with the new ID created thus I have no link between the 2 tables.我没有收到任何错误,但是当保存 OrderLine 时,生成的列 (OrderLineCustomFields_OrderLineCustomFieldsId) 没有被创建的新 ID 标记,因此我在 2 个表之间没有链接。

If I create a new OrderLine (not an existing row), everything is inserting correctly.如果我创建一个新的 OrderLine(不是现有的行),一切都正确插入。

public class OrderLine
{
        public int OrderLineId { get; set; }
        public virtual OrderLineCustomFields OrderLineCustomFields { get; set; }
}

public class OrderLineCustomFields
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int OrderLineCustomFieldsId { get; set; }
    public string SomeValue { get; set; }
}

Sample New object:示例新对象:

var ol = new OrderLine();
ol.OrderLineId = 1;
ol.OrderLineCustomFields = new OrderLineCustomFields();
ol.OrderLineCustomFields.SomeValue = "NewValue";

Repository code:存储库代码:

var olEntity = context.OrderLines?
                .Where(x => x.OrderLineId == ol.OrderLineId)
                .FirstOrDefault();


var olCustomEntity = context.OrderLineCustomFields?
                .Where(x => ol.OrderLineCustomFields.OrderLineCustomFieldsId == x.OrderLineCustomFieldsId)
                .FirstOrDefault();

if (olCustomEntity == null)  //if there isn't a record already, then add it.
{
    context.Entry(ol.OrderLineCustomFields).State = EntityState.Added;
}
else  //else, update the record with new data
{
    ol.OrderLineCustomFields.OrderLineCustomFieldsId = olCustomEntity.OrderLineCustomFieldsId;
    context.Entry(olCustomEntity).CurrentValues.SetValues(ol.OrderLineCustomFields);
}

//Save the orderLine
context.Entry(olEntity).CurrentValues.SetValues(ol);
context.SaveChanges();

I was able to get it working.我能够让它工作。 I didn't let EF know that the OrderLine was modified:我没有让 EF 知道 OrderLine 被修改了:

context.Entry(olEntity).State = EntityState.Modified;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM