实体框架Upsert但不是主键

时间:2014-05-18 12:29:24

标签: sql-server ef-code-first entity-framework-6 upsert

我将动物存储在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。

0 个答案:

没有答案