2010-12-23 57 views
0

那样我更新了Pupil实体的所有属性。我怎样才能只更新真正改变/弄脏那些属性...是否可以仅更新SQLite数据库才能更改那些属性?

我知道存在一种模式添加一个IsDirty标志到模型/ viewModel,但为每个属性添加一个这样的标志?然后做整个检查,并动态地构建SQLiteParameter集合是不是有点太多的开销?

更新ALL会不会更好?

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) 
{ 
    using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager)) 
    { 
    com.Parameters.Add(new SQLiteParameter("@pupilId", pupil.Id)); 
    com.Parameters.Add(new SQLiteParameter("@firstname", pupil.FirstName)); 
    com.Parameters.Add(new SQLiteParameter("@lastname", pupil.LastName)); 
    com.Parameters.Add(new SQLiteParameter("@gender", pupil.Gender)); 
    com.Parameters.Add(new SQLiteParameter("@street", pupil.Street)); 
    com.Parameters.Add(new SQLiteParameter("@city", pupil.City)); 
    com.Parameters.Add(new SQLiteParameter("@postal", pupil.Postal)); 
    com.Parameters.Add(new SQLiteParameter("@phone", pupil.Phone)); 
    com.Parameters.Add(new SQLiteParameter("@email", pupil.Email)); 
    com.Parameters.Add(new SQLiteParameter("@extrainformation",pupil.ExtraInformation)); 

    com.CommandText = "UPDATE pupil SET firstname = @firstname, lastname = @lastname, gender = @gender, street = @street," + " city = @city, postal = @postal, phone = @phone, email = @email, extrainformation = @extrainformation WHERE pupilId = @pupilId"; 
    com.ExecuteNonQuery(); 
    } 
    trans.Commit(); 
} 

回答

0

是的,你可以跟踪每一个改变的属性,但这不会很有趣,代码可能会很快变得非常难看,所以我不会建议它。

在这种情况下,考虑您正在更新的数据类型,我认为增加的开销可能会降低应用程序的运行时间,然后进行单个数据库更新。

请注意,从数据库中获取单个记录会花费更多时间来更新该记录,因此更新一个属性或十一个属性的总数不会有太大的差别。保持对单个对象/实体的跟踪可能会引起注意,但这很大程度上取决于应用程序,它的用途以及您愿意投入多少时间。

0

对于给定的数据模型,你可以把你提到的IsDirty标志。在大多数情况下,这足够好。但是,如果由于某种原因,你希望每个属性都有这个属性,那么你可以使用一个IsDirty标志(比如一个标志,而不是一个bool标志)。无论如何,开销将在数据模型(基础)中的某个地方完成......所以一个通用的逻辑将为您处理所有这些开销(编写一次并在所有地方自动使用)。

另一种方法是为每个创建的数据模型创建第二个副本(保留原始值的备份副本)。那么你可以检查它。

我真的只会考虑如果I/O时间到数据库需要比你看到的更快。如果你的数据模型有一大堆属性,那么这可能是一个好主意。否则,它可能不值得花时间去做。