How do I upsert a record in ADO.NET EF 4.1?

后端 未结 5 1967
走了就别回头了
走了就别回头了 2021-01-01 23:22

I\'m trying to accomplish something really simple and I can\'t find how to do it using Entity Framework 4.1.

I want a controller method that accepts an object and

5条回答
  •  渐次进展
    2021-01-02 00:05

    I know this question is old and has an accepted answer, but I think there is a better solution: it doesn't require an extra interface to be implemented or key type to be defined.

    public static class DbSetExtensions
    {
        public static EntityEntry AddIfNotExists(this DbSet dbSet, TEnt entity, Func predicate) where TEnt : class
        {
            var exists = dbSet.Any(c => predicate(entity).Equals(predicate(c)));
            return exists
                ? null
                : dbSet.Add(entity);
        }
    
        public static void AddRangeIfNotExists(this DbSet dbSet, IEnumerable entities, Func predicate) where TEnt : class
        {
            var entitiesExist = from ent in dbSet
                where entities.Any(add => predicate(ent).Equals(predicate(add)))
                select ent;
    
            dbSet.AddRange(entities.Except(entitiesExist));
        }
    }
    

    So later it can be used like this:

    using (var context = new MyDbContext())
    {
        var user1 = new User { Name = "Peter", Age = 32 };
        context.Users.AddIfNotExists(user1, u => u.Name);
    
        var user2 = new User { Name = "Joe", Age = 25 };
        context.Users.AddIfNotExists(user2, u => u.Age);
    
        // Adds user1 if there is no user with name "Peter"
        // Adds user2 if there is no user with age 25
        context.SaveChanges();
    }
    

提交回复
热议问题