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)!
精彩评论