我想使用EF做一个数据加载并卡住当儿童记录存在时无法插入新记录的地方。这是一个例子。实体框架:用新的父对象更新现有的子对象
public class Position
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }
public string PositionName { get; set; }
}
public class Application
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }
public string ApplicationName { get; set; }
public Position ApplicationPosotion { get; set; }
}
在上述例子中的多个应用程序可以属于一个位置。假设我们已经有职位记录,并且如果我拨打以下电话,它将失败,因为ID为5的位置已经在数据库中。
public static void UseEntityFrameWorkOneFail()
{
using (var db = new DemoDbContext(@"Server=DESKTOP-HUJVOQ5\SQLEXPRESS;Database=Demo2;Trusted_Connection=True;"))
{
Application appOne = new Application
{
Id = 7,
ApplicationName = "AppOne",
ApplicationPosotion = new Position { Id = 5, PositionName = "ABC" }
};
db.Applications.Add(appOne);
db.SaveChanges();
appOne = db.Applications.Find(7);
Console.WriteLine(appOne.ApplicationPosotion.PositionName);
}
}
现在我可以拉这个纪录,让这样的电话,得到它的工作
public static void UseEntityFrameWorkPass()
{
using (var db = new DemoDbContext(@"Server=DESKTOP-HUJVOQ5\SQLEXPRESS;Database=Demo2;Trusted_Connection=True;"))
{
Application appOne = new Application
{
Id = 8,
ApplicationName = "AppOne",
ApplicationPosotion = db.Positions.Find(5)
};
db.Applications.Add(appOne);
db.SaveChanges();
appOne = db.Applications.Find(8);
Console.WriteLine(appOne.ApplicationPosotion.PositionName);
}
}
但是我想知道如果有一个简单的方法来做到这一点。我将JSON转换为对象并保存用于数据加载目的。
我只想要的是如果子记录存在(在这种情况下位置),那么只需使用新值更新它。 一个的Upsert
Application appOne = new Application
{
Id = 7,
ApplicationName = "AppOne",
ApplicationPosotion = new Position { Id = 5, PositionName = "123" }
};
db.Applications.AddOrUpdate(appOne);
db.SaveChanges();
在那里我使用AddOrUpdate会做的Upsert父对象,但不是孩子的对象上面的例子。我希望子对象也被更新。
感谢
以上仍然强迫我做检查。我正在寻找一种方法来覆盖子对象具有的任何值。更喜欢Upsert –
是不是'db.Positions.FirstOrDefault(o => o.Id == 5))??''而不是'.Any('? – Developer