C# 更新对象LinqToSql
我有三门课:C# 更新对象LinqToSql,c#,linq-to-sql,C#,Linq To Sql,我有三门课: 基地、大厅、大厅平面图 关系: 基地大厅:一对多。 大厅-大厅平面图:一对多 我从远程程序获得位置(场地)。我使用以下方法添加(或更新)对象: 如何正确更新? 谢谢 Add(): 公共虚拟空添加(TClass实体) { Check.Argument.IsNotNull(实体,“实体”); Database.GetTable().InsertOnSubmit(实体); } LINQ to SQL有一个身份管理器;如果它在树中发现它无法识别的内容(即不在identity manager
基地、大厅、大厅平面图
关系:基地大厅
:一对多。大厅
-大厅平面图
:一对多
我从远程程序获得位置(场地)。我使用以下方法添加(或更新)对象:
如何正确更新?
谢谢
Add()
:
公共虚拟空添加(TClass实体)
{
Check.Argument.IsNotNull(实体,“实体”);
Database.GetTable().InsertOnSubmit(实体);
}
LINQ to SQL有一个身份管理器;如果它在树中发现它无法识别的内容(即不在identity manager中),则它会假定该内容将被视为该项目的插入内容。因此,因为它无法识别您的霍尔
实例,所以它正在插入它们
有两种方法可以解决此问题:
- 与直接将非L2S模型中的
分配给L2S模型不同,您可以向数据上下文询问匹配的实例,即在一个循环中,使用Halls
从数据上下文中获得等效的ctx.Halls.FirstOrDefault(…)
,并添加该,而不是原始的Hall
- 在开始之前,使用
方法(即Attach
)让L2S知道大厅实例ctx.Halls.Attach(…)
PlaceId
列是BasePlace
表的外键吗?重复的行是那些在22
和24
之间有OID
的行吗?你的add()是做什么的。@Enricoampidoglio:是的,它是FK。是的,在22-24之间复制。@Pleun:我更新了qiestion。在本例中添加方法not call。在本例中,place.Halls
来自何处?这是否来自相同的数据上下文?我添加了以下内容:Database.BasePlaces.Attach(place)代码>。没有错误,但在数据库中没有更改。@user348173它不是您要附加的位置;这是大厅,不是吗?我要Place
和所有收藏:Place.Halls
。Hall
有集合HallPlans
@user348173是,但每个Hall都是一个对象。。。听起来您想使用数据上下文中的现有对象…?是的,并更改其属性。
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();
}
}
}
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);
}