5

私は EF Code First CTP4 を正常に動作させ、今日 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 = "dave@dave.com",
                City = "San Francisco",
                AccountStatus = "Active",
                State = "CA",
                FirstName = "David",
                LastName = "Daverson",
                Zip = "94118",
                GeoLat = 37.735,
                GeoLong = -122.392 },

            new Member { 
                Email = "bob@bob.com", 
                City = "Oakland", 
                AccountStatus = "Active", 
                State = "CA", 
                FirstName = "Bob", 
                LastName = "Boberson", 
                Zip = "94601",
                GeoLat = 37.781,
                GeoLong = -122.216 },

           new Member {
               Email = "jenny@jenny.com",
               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: 競合する変更が検出されました。これは、同じキーを持つ複数のエンティティを挿入しようとしたときに発生することがあります。

何が変わったのか、なぜこれが機能しなくなったのか、誰にも分かりませんか? これを機能させるには、何を変更する必要がありますか?

4

2 に答える 2

0

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

int 型のキーと一意の行 ID としての Guid が必要なため、同様の問題があります。また、エンティティで両方を使用すると、別々の小道具であってもシードが機能しなくなります。

于 2011-01-08T15:58:28.800 に答える
0

おそらく、使用している変数名が EF によって複数形化されて生成されているためです。

それ以外の :

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

これを試して

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

....


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

コードを Scott Gu の http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspxと比較します

于 2011-09-13T16:55:55.887 に答える