实体框架6不存储子对象

时间:2017-06-29 14:16:37

标签: c# entity-framework

我已经在我的课程中添加了一个道具并添加了一个新的DbSet,但在保存时,它不存储我的子对象。 我家班:

[Table("Houses")]
public class House
{
    [Key]
    public int ID { get; set; }
    public List<Price> Prices { get; set; } // <-- new prop
}

我的dbcontext现在有一个Prices道具:public DbSet<Price> Prices { get; set; }我启用了迁移,添加了迁移并更新了数据库。因此创建了价格表。

当我更新House对象时,它不会在Prices表中插入任何内容。

var h = new House(); // with prices etc filled
if (db.Houses.Any(hc => hc.Code.Equals(h.Code, StringComparison.InvariantCultureIgnoreCase)))
{
    var original = db.Houses.First(k => k.Code.Equals(h.Code, StringComparison.InvariantCultureIgnoreCase));
    h.ID = original.ID; // workaround for The property 'ID' is part of the object's key information and cannot be modified.
    h.CountryId = original.CountryId;

    db.Entry(original).CurrentValues.SetValues(h);
    db.SaveChanges(); // does update House fields, but no prices
} else { // add new 
    db.Houses.Add(h);
    db.SaveChanges();
}

我确实在public virtual House House { get; set; }课程中添加了Price。但是我没有填写它,因为在填充house对象时,我还不知道db中的ID。也许这是造成它的?我还阅读了https://stackoverflow.com/a/26572122/169714并将其添加到我的Price课程中:

[ForeignKey("HouseId")]
public virtual House House { get; set; }
public int HouseId { get; set; }

但价格表中仍然没有条目。 我可能在存储/更新数据库方面做错了。

编辑当前商店方法:

using (var db = new MyCommon.HouseContext()) 
{
    var l = db.Countries.First(tmpC => tmpC.Code.Equals(h.Country.Code));
    h.OperatorId = op.ID;
    h.CountryId = l.ID;
    h.Country = l;

    var existingHouse = db.Houses.Where(p => p.Code.Equals(h.Code, StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault();

    if (existingHouse != null)
    {
        // update
        h.ID = existingHouse.ID; // workaround for The property 'ID' is part of the object's key information and cannot be modified.
        h.CountryId = existingHouse.CountryId;
        h.OperatorId = existingHouse.OperatorId;

        db.Entry(existingHouse).CurrentValues.SetValues(h);
        db.Entry(existingHouse).State = System.Data.Entity.EntityState.Modified;
        //db.SaveChanges(); // moved to bottom for perf. 
    }
    else
    {
        existingHouse = h;
        db.Houses.Add(h);            // insert
    }

    foreach (var ft in existingHouse.Prices)
    {
        var existingFt = existingHouse.Prices.SingleOrDefault(f => f.ID == ft.ID);

        if (existingFt != null)
        {
            db.Entry(existingFt).CurrentValues.SetValues(ft);
            db.Entry(existingFt).State = System.Data.Entity.EntityState.Modified;
        }
        else
        {
            existingHouse.Prices.Add(ft);
        }
    }
    db.SaveChanges();
}

1 个答案:

答案 0 :(得分:0)

检查对象的EntityState。将对象附加到您的上下文,并迭代这些Prices以标记EntityState.Modified。如果Price个对象是新的,则可以使用EntityState.Added.您可以看到here以查找“{1}}”对象。模式示例。