2010-12-10 67 views
5

我有EF代码优先CTP4工作正常,我今天安装了CTP5。现在,当我的数据库重新填充时,我收到了一个异常。EF4代码第一CTP5:种子方法不再有效

这里是我的模型:

public class Member 
{ 
    public Member() 
    { 
     DateCreated = DateTime.Now; 
     DateUpdated = DateTime.Now; 
     DateLastLogin = DateTime.Now; 
    } 
    [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] \\I have tried removing these annotations and the result is the same 
    public int MemberId { get; set; } 
    [Required,RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")] 
    public string Email { get; set; } 
    [Required,StringLength(20,MinimumLength=2)] 
    public string FirstName { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string LastName { get; set; } 
    [Required, StringLength(36, MinimumLength = 2)] 
    public string City { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string State { get; set; } 
    [Required, StringLength(20, MinimumLength = 2)] 
    public string Zip { get; set; } 
    public double GeoLat { get; set; } 
    public double GeoLong { get; set; } 
    public string AccountStatus { get; set; } 
    public DateTime DateCreated { get; private set; } 
    public DateTime DateUpdated { get; set; } 
    public DateTime DateLastLogin { get; set; } 

    public virtual PublicProfile Profile { get; set; }   
} 

这里是被称为在Global.asax.cs中

protected void Application_Start() 
{   
    RegisterRoutes(RouteTable.Routes); 
    DbDatabase.DefaultConnectionFactory = new SqlConnectionFactory("System.Data.SqlClient"); 
    DbDatabase.SetInitializer<MeetPplDB>(new Initializer()); 
} 

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var Members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "David", 
       LastName = "Daverson", 
       Zip = "94118", 
       GeoLat = 37.735, 
       GeoLong = -122.392 }, 

      new Member { 
       Email = "[email protected]", 
       City = "Oakland", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "Bob", 
       LastName = "Boberson", 
       Zip = "94601", 
       GeoLat = 37.781, 
       GeoLong = -122.216 }, 

      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
       AccountStatus = "Active", 
       State = "CA", 
       FirstName = "Jenny", 
       LastName = "Jennerson", 
       Zip = "94123", 
       GeoLat = 37.735, 
       GeoLong = -122.392 } 
     }; 
     Members.ForEach(m => context.Members.Add(m)); 
     context.SaveChanges(); 
    } 
} 

当它击中上下文调用SaveChanges的代码,我得到这个例外:

检测到冲突的变化。尝试插入具有相同密钥的多个实体时可能会发生这种情况。

描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。

异常详细信息:System.Data.UpdateException:检测到冲突的更改。尝试插入具有相同密钥的多个实体时可能会发生这种情况。

有没有人知道什么改变了,为什么这不起作用?需要改变这个工作?

+0

我什么都看不到你的代码错误或复制问题代码。对不起,祝你好运。 – Paul 2010-12-11 00:08:08

+0

我在关注[本系列](http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction- and-model.aspx),并且我的初始化程序没有任何'SaveChanges'调用,但仍然正确地填充数据库。也许CTP4和CTP5之间的变化是为初始化器保存更改的位置? – ProfK 2011-02-20 08:25:42

回答

0

你的例外的原因是你的数据类型int与DatabaseGenerationOption.Identity结合在一起。使用身份将生成一个GUID而不是一个INT键。

我有一个类似的问题,因为我想要一个类型为int的Key和一个Guid作为唯一的rowid。如果我在一个实体上使用两个种子,即使它们在单独的道具中,种子也会停止工作。

+0

尚未找到任何解决方案?我现在有完全相同的问题。 – 2011-05-12 11:53:30

0

也许是因为您使用的变量名已被EF生成为复数形式。

相反的:

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var Members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 
..... 

试试这个

public class Initializer : DropCreateDatabaseAlways<MeetPplDB> 
{ 
    protected override void Seed(MeetPplDB context) 
    { 
     var _members = new List<Member> 
     { 
      new Member { 
       Email = "[email protected]", 
       City = "San Francisco", 

.... 


_members.ForEach(m => context.Members.Add(m)); 
     context.SaveChanges(); 

我比较你与斯科特谷的 http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

相关问题