gpt4 book ai didi

c# - 更新对象 LinqToSql

转载 作者:行者123 更新时间:2023-11-30 22:30:24 25 4
gpt4 key购买 nike

我有 3 个类(class):
BasePlace、Hall、HallPlan

关系:
BasePlace - Hall:一对多。
Hall - HallPlan:一对多。

我从远程程序中获取地点(地点)。我有以下方法来添加(或更新)对象:

public void AddPremieraPlace(IEnumerable<BasePlace> places)
{
if(places != null)
{
foreach (var place in places)
{
//is exist in db
var dbPlace = Database.BasePlaces.FirstOrDefault(p => p.OIDPremiera == place.OIDPremiera);
// if exist update properties and collections
if (dbPlace != null)
{
dbPlace.Name = place.Name
dbPlace.Halls = place.Halls;
}
else
Add(place); // just add new place

Database.SubmitChanges();
}

}
}

当 place 存在于数据库中时,更新将无法正常工作。在 HallHallPlan 中创建副本:大厅表,例如:

OID   Name       PlaceId  OIDPremiera
19 Redisson NULL 1
20 Test 2 NULL 3
21 Test 3 NULL 2

22 Redisson 5 1
23 Test 2 5 3
24 Test 3 5 2

如何正确更新?谢谢。

添加():

public virtual void Add(TClass entity)
{
Check.Argument.IsNotNull(entity, "entity");

Database.GetTable<TClass>().InsertOnSubmit(entity);
}

最佳答案

LINQ-to-SQL 有一个身份管理器;如果它在树中找到它无法识别的东西(即不在身份管理器中),那么它会假定它被视为该项目的插入。因为它无法识别您的 Hall 实例,所以它正在插入它们。

有两种方法可以解决这个问题:

  • 与其直接将 Halls 从您的非 L2S 模型分配给 L2S 模型,您可以询问匹配实例的数据上下文,即在一个循环中,使用 ctx.Halls.FirstOrDefault(...) 从数据上下文中获取等效的 Hall,并添加 that 而不是原创
  • 在开始之前使用Attach 方法(即ctx.Halls.Attach(...))让 L2S 知道大厅实例

关于c# - 更新对象 LinqToSql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com