开发者

LINQ to Sql: Insert instead of Update

I am stuck with this problems for a long time now.

Everything I try to do is insert a row in my DB if it's new information - if not update the existing one.

I've updated many entities in my life before - but what's wrong with this code is beyond me (probably something pretty basic) I guess I can't see the wood for the trees...

private Models.databaseDataContext db = new Models.databaseDataContext();

internal void StoreInformations(IEnumerable<EntityType> iEnumerable)
{
 foreach (EntityType item in iEnumerable)
 开发者_开发知识库{
  EntityType type = db.EntityType.Where(t => t.Room == item.Room).FirstOrDefault();
  if (type == null)
  {
   db.EntityType.InsertOnSubmit(item);
  }
  else
  {
   type.Date = item.Date;
   type.LastUpdate = DateTime.Now();
   type.End = item.End;
  }       
 }
}

internal void Save()
{
 db.SubmitChanges();
}

Edit: just checked the ChangeSet, there are no updates only inserts. For now I've settled with

foreach (EntityType item in iEnumerable)
{
    EntityType type = db.EntityType.Where(t => t.Room == item.Room).FirstOrDefault();
    if (type != null)
    {
        db.Exams.DeleteOnSubmit(type);
    }
    db.EntityType.InsertOnSubmit(item);
}

but I'd love to do updates and lose these unnecessary delete statements.


Wouldn't you want item.Room instead of iEnumerable.Room?


I wonder if you are experiencing issues due to the problem discussed here: Why can't I change elements from a linq IEnumerable in a for loop?

One way to test it would be to pass in a List of EntityType instead of IEnumerable as such:

internal void StoreInformations(IList<EntityType> iEnumerable)
{
...
}


Well, I worked out why it didn't work the way I anticipated it.

function Stuff()
{    
    Wrapper x = new Wrapper();
    Type a = new Type();
    InsertType(a);
    x.Type = a;
    InsertOnSubmit(x);
}

function InsertType (Type a)
{
    InsertOnSubmit(a);
}

since a in x is still the same a will be inserted a second time - it's still new. Somehow I thought that they were referenced and essentially the same.

I haven't thought about why it does work when I delete the old record first. Don't want to waste any more time on this. On to new worlds (EF4 or NHibernate)!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜