我将动物存储在Entity Framework Code First创建的SQL Server数据库表中。这是它的POCO:
[Table("Animal")]
public class Animal
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string SomeData { get; set; }
public byte[] OtherData { get; set; }
public int ExternalSourceId { get; set; }
public string ExternalSourceAnimalId { get; set; }
}
有些动物会定期通过外部来源进行更新(有一些来源,但特定动物会从最多1个来源更新)。此外,当外部来源有新动物时,需要插入。有些动物在当地饲养,没有外来来源。
外部来源的动物由ExternalSourceAnimalId
识别。这些对于一个来源是唯一的,但是有两个来源使用重叠ID的可能性,因此ExternalSourceId
也可以使其中的两个成为组合的自然键。
所以我从外部源获取了大量动物,我需要在本地数据库中插入或更新它们,具体取决于我们的数据库中是否存在特定的外部键。
这是我目前解决此问题的方法(在继承SharpRepository形式的类中):
public void InsertOrUpdateAnimal(ExternalAnimal exAnimal, int externalSourceId)
{
var animal = DbSet.SingleOrDefault(o => o.ExternalSourceId == externalSourceId && o.ExternalSourceAnimalId == exAnimal.Id);
if (animal != null)
{
CopyData(exAnimal, animal); // copies the properties from exAnimal to animal
this.Update(animal);
}
else
{
animal = new Animal();
CopyData(exAnimal, animal);
this.Add(animal);
}
}
由于这是一个批量操作,需要相当长的时间,我想知道是否有更快的解决方案。例如,如果有一种方法可以在单个数据库操作中进行upsert。