我正在尝试使用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。我希望更新子对象。
由于
答案 0 :(得分:1)
var appPosotion = db.Positions.Any(o => o.Id== 5)) ?? new Position { Id = 5, PositionName = "ABC" }
Application appOne = new Application
{
Id = 8,
ApplicationName = "AppOne",
ApplicationPosotion = appPosotion
};
答案 1 :(得分:0)
这是你在找什么?更新ApplicationPosotion
而无需访问给定ID的Position
数据库(此处为5)?
var position = new Position { Id = 5};
db.Positions.Attach(position);
Application appOne = new Application
{
Id = 8,
ApplicationName = "AppOne",
ApplicationPosotion = position
};
db.Applications.Add(appOne);
db.SaveChanges();
答案 2 :(得分:0)
以上作品。这是我修改过的代码。
Application appOne = new Application
{
Id = 7,
ApplicationName = "AppOne",
ApplicationPosotion = new Position { Id = 5, PositionName = "123" }
};
db.Positions.AddOrUpdate(appOne.ApplicationPosotion);
db.Applications.AddOrUpdate(appOne);
db.SaveChanges();
appOne = db.Applications.Find(7);
Console.WriteLine(appOne.ApplicationPosotion.PositionName);
他们在EF中的简单设置怎么说只是做一个Upsert?现在我必须将每个对象分解。
答案 3 :(得分:0)
以下是3级深度
的示例 Application appOne = new Application
{
Id = 7,
ApplicationName = "AppOne",
ApplicationPosition = new Position
{
Id = 5,
PositionName = "123",
SalaryAmount = new Salary() { Id = 1, SalaryAmount = 200000 }
}
};
db.Salarys.AddOrUpdate(appOne.ApplicationPosition.SalaryAmount);
db.Positions.AddOrUpdate(appOne.ApplicationPosition);
db.Applications.AddOrUpdate(appOne);
db.SaveChanges();
appOne = db.Applications.Find(7);
Console.WriteLine(appOne.ApplicationPosition.SalaryAmount.SalaryAmount);
但我喜欢跳过这一步
db.Salarys.AddOrUpdate(appOne.ApplicationPosition.SalaryAmount);
db.Positions.AddOrUpdate(appOne.ApplicationPosition);
因为我不想为每个对象设置它。