我使用的是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方法的调用并未按预期工作。
答案 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; }
}
}