IDbSet <tentity> .AddOrUpdate不检查数据是否已存在并插入重复的行

时间:2015-12-31 08:07:59

标签: .net entity-framework entity-framework-6

我使用的是Entity Framework v6.1.2,目标是.NET框架的v4.5.2,并且有一个运行SQL Server 2014的LocalDb实例。

我有一个像这样的表,它已经有一些像这样的数据:

Foo
---------
Id    Name
---------
1    Apple
2    Ball
3    Cat

我在此数据库上启用了Entity Framework迁移。

这是我在这张桌子的种子中的代码。

namespace MyProject.Models.SeedData
{
    public class FooSeeder : IDataSeeder
    {
        public void Seed(ApplicationDbContext context)
        {
            var foos = new string[]
            {
                "Apple",
                "Ball",
                "Cat"
            };

            context.Foos.AddOrUpdate(foo => new { foo.Name },
                foos.Select(f => new Foo { Name = f }).ToArray()
                );

            context.SaveChanges();
        }
    }
}

我希望如果存在相同的Foo.Name,它不能添加新行,而应该只更新现有行。

但是,当我运行播种器时,它会为所有数据创建新行,因此在运行种子后,表格如下所示:

Foo
---------
Id    Name
---------
1    Apple
2    Ball
3    Cat
4    Apple
5    Ball
6    Cat

显然,对AddOrUpdate方法的调用并未按预期工作。

1 个答案:

答案 0 :(得分:1)

作为答案发布,因为评论不会允许足够的字符发布示例代码。但是,正如评论中所讨论的,这不会基于所描述的简单场景重现。

以下是我用来尝试重现它的示例应用。多次运行只会在数据库中产生预期的三个结果。也许你可以发布一个更完整的代码清单来证明这个问题?

using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;

namespace Repro.EF6
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var context = new FooContext())
            {
                var foos = new string[]
                {
                "Apple",
                "Ball",
                "Cat"
                };

                context.Foos.AddOrUpdate(foo => new { foo.Name },
                    foos.Select(f => new Foo { Name = f }).ToArray()
                    );

                context.SaveChanges();
            }
        }
    }

    public class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class FooContext : DbContext
    {
        public DbSet<Foo> Foos { get; set; }
    }
}
相关问题