2010-12-10 23 views
5

Tôi có EF Code First CTP4 làm việc tốt, và tôi đã cài đặt CTP5 hôm nay. Bây giờ, tôi nhận được một ngoại lệ khi cơ sở dữ liệu của tôi được repopulated.Mã EF4 Đầu tiên CTP5: Phương pháp hạt giống không còn hoạt động

Đây là mô hình của tôi:

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; }   
} 

Đây là mã đang được gọi là trong 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(); 
    } 
} 

Khi nó chạm vào SaveChanges vào bối cảnh, tôi nhận được ngoại lệ này :

Đã phát hiện các thay đổi xung đột. Điều này có thể xảy ra khi cố gắng chèn nhiều thực thể với cùng một khóa.

Mô tả: Một ngoại lệ không được xử lý xảy ra trong khi thực hiện yêu cầu web hiện tại. Vui lòng xem lại dấu vết ngăn xếp để biết thêm thông tin về lỗi và vị trí bắt nguồn từ mã.

Chi tiết ngoại lệ: System.Data.UpdateException: Đã phát hiện các thay đổi xung đột. Điều này có thể xảy ra khi cố gắng chèn nhiều thực thể với cùng một khóa.

Có ai có ý tưởng gì đã thay đổi và lý do điều này không hoạt động nữa? Những gì cần phải thay đổi để làm việc này?

+0

Tôi không thể nhìn thấy bất cứ điều gì sai trái với mã của bạn hoặc tái tạo vấn đề. Xin lỗi, chúc may mắn. – Paul

+0

Tôi đang theo dõi [loạt bài này] (http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction- và-model.aspx) trên CTP5, và trình khởi tạo của tôi không có bất kỳ lệnh gọi 'SaveChanges' nào, nhưng vẫn điền chính xác cơ sở dữ liệu. Có lẽ một cái gì đó giữa CTP4 và CTP5 thay đổi liên quan đến nơi thay đổi được lưu cho một initializer? – ProfK

Trả lời

0

Lý do ngoại lệ của bạn là bạn có datatype int kết hợp với DatabaseGenerationOption.Identity. Sử dụng danh tính sẽ tạo ra một guid và không phải là một khóa int.

Tôi có vấn đề tương tự vì tôi muốn có một Khóa kiểu int và Hướng dẫn là một dòng duy nhất. Và hạt giống ngừng hoạt động nếu tôi sử dụng cả hai trên thực thể ngay cả khi chúng nằm trong các đạo cụ riêng biệt.

+0

chưa tìm thấy giải pháp nào cho điều đó? tôi có chính xác cùng một vấn đề ngay bây giờ. –

0

Có thể vì tên biến mà bạn sử dụng đã được tạo ra như được đa số bởi EF.

Thay vì:

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

thử này

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(); 

tôi so sánh mã của bạn với Scott Gu của http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx

Các vấn đề liên quan