2010-12-10 10 views
5

EFコードが最初に正常に動作しました。今、私のデータベースが再投入されたときに例外が発生します。ここで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; }   
} 

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

Global.asax.cs

に呼び出されているコード、それは文脈上のSaveChangesを打つとき、私はこの例外を取得することです:

矛盾する変更が検出されました。これは、同じキーを持つ複数のエンティティを挿入しようとしたときに発生する可能性があります。

説明現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。

例外の詳細:System.Data.UpdateException:競合する変更が検出されました。これは、同じキーを持つ複数のエンティティを挿入しようとしたときに発生する可能性があります。

何が変更されたのか、またこれがもううまくいかない理由はありますか?これが機能するには何を変える必要がありますか?

+0

であなたのコードを比較してみてください。申し訳ありません、幸運。 – Paul

+0

私は[このシリーズ](http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1-introduction- and-model.aspx)をCTP5上に置いて、私のイニシャライザは 'SaveChanges'呼び出しを持っていませんが、データベースを正しく読み込みます。おそらく、CTP4とCTP5の間の何かが、イニシャライザの変更が保存される場所に関して変更されましたか? – ProfK

答えて

0

例外の理由は、データ型intとDatabaseGenerationOption.Identityを組み合わせているためです。 IDを使用すると、intキーではなくguidが生成されます。

私はint型のキーとGuidを一意のROWIDとして持つため、同様の問題があります。別の小道具であっても、どちらのエンティティでもシードを使用すると、シードは機能しなくなります。

+0

まだ解決策が見つかりましたか?私は今まさに同じ問題を抱えています。 –

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

関連する問題