我已经在我的课程中添加了一个道具并添加了一个新的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();
}
答案 0 :(得分:0)
检查对象的EntityState
。将对象附加到您的上下文,并迭代这些Prices
以标记EntityState.Modified
。如果Price
个对象是新的,则可以使用EntityState.Added.
您可以看到here以查找“{1}}”对象。模式示例。