0

Entity Frameworkでコードファーストアプローチを使用してシードしようとしている多対多の関係があります。実際にデータを正しくシードしているのは、最上位のレイヤーだけです。ユーザー クラスはシードされていますが、基になるオブジェクトのリストはシードされていません。私のポコは以下の通りです。

public class User:Database
    {
        public String FirstName { get; set; }
        public String LastName { get; set; }
        public String UserName { get; set; }
        public String Password { get; set; }
        public String Email { get; set; }

        public virtual List<Address> Addresses { get; set; }
        public virtual List<UserRole> UserRoles { get; set; }

    }
public class Address:Database
    {
        public String City { get; set; }
        public String State { get; set; }
        public int Zip { get; set; }
        public String StreetAddress1 { get; set; }
        public String StreetAddress2 { get; set; }

        public int CountryID { get; set; }
        public virtual Country Country { get; set; }

        public int AddressTypeID { get; set; }
        public virtual AddressType Type { get; set; }


    }

public class UserRole:Database
    {
        public int UserID { get; set; }
        public virtual User User { get; set; }

        public int RoleID { get; set; }
        public virtual Role Role { get; set; }
    }

public class Role:Database
    {
        public String Name { get; set; }
    }

public abstract class Database
    {
        public int ID { get; set; }
        public DateTime CreatedAt { get; set; }
        public DateTime UpdatedAt { get; set; }
        public Boolean IsActive { get; set; }

    }

私が構築したシードメソッドは次のとおりです。

protected override void Seed(CodeFirstODS.DAL.DBContext.Context context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //

            context.Users.AddOrUpdate(
                u => u.ID,
                new Models.User { 
                    ID=1, 
                    FirstName="James",
                    LastName = "Rainey",                    
                    UserName = "BloodyRu1n",
                    Password = "bobcat*",
                    Email = "james_1999@blue.com",
                    Addresses = new List<Models.Address>(){
                        new Models.Address(){
                            ID = 1,
                            StreetAddress1 = "1260 Monkey Knoll",
                            City = "Marietta",
                            State = "Geaorgia",
                            Country = new Models.Country(){
                                ID = 1,
                                Name = "USA",
                                CreatedAt = DateTime.Now,
                                UpdatedAt = DateTime.Now,
                                IsActive = true
                            },
                            Type = new Models.AddressType(){
                                ID = 1,
                                Name = "Home",
                                CreatedAt = DateTime.Now,
                                UpdatedAt = DateTime.Now,
                                IsActive = true
                            },
                            CreatedAt = DateTime.Now,
                            UpdatedAt = DateTime.Now,
                            IsActive = true
                        }
                    },
                    UserRoles = new List<Models.UserRole>(){
                        new Models.UserRole(){
                            Role = new Models.Role(){
                                ID = 1,
                                Name = "Admin",
                                CreatedAt = DateTime.Now,
                                UpdatedAt = DateTime.Now,
                                IsActive = true
                            }                            
                        },
                        new Models.UserRole(){
                            Role = new Models.Role(){
                                ID = 1,
                                Name = "Admin",
                                CreatedAt = DateTime.Now,
                                UpdatedAt = DateTime.Now,
                                IsActive = true
                            }
                        },
                    },
                    CreatedAt = DateTime.Now,
                    UpdatedAt = DateTime.Now,
                    IsActive = true
                }
            );//End User 1 Seed
            context.SaveChanges();
        }

この場合も、ユーザー データはデータベースに正しく反映されていますが、基になるオブジェクトのリストはすべてデータベースに反映されていません。すべてのテーブルが期待どおりに処理されています。Context クラスは次のとおりです。

public class Context:DbContext
    {

        public DbSet<User> Users { get; set; }
        public DbSet<UserRole> UserRoles { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<Address> Addresses { get; set; }
        public DbSet<AddressType> AddressTypes { get; set; }
        public DbSet<Country> Countries { get; set; }

    }

現状のデータベースはこんな感じ。

ID  FirstName   LastName    UserName    Password    Email   CreatedAt   UpdatedAt   IsActive
1   James   Rainey  BloodyRu1n  bobcat* james_1999@blue.com 2013-07-04 19:34:46.767 2013-07-04 19:34:46.767 1

アドレスおよびその他のオブジェクト テーブルには、値が挿入されていません。

どんな助けでも大歓迎です!! みんなありがとう。

J

4

1 に答える 1

2

これをバラバラにアプローチすることをお勧めします:

ユーザーを追加

context.Users.AddOrUpdate(
        u => u.ID,
        new Models.User { 
          ID=1, 
          FirstName="James",
          LastName = "Rainey",                    
          UserName = "BloodyRu1n",
          Password = "bobcat*",
          Email = "james_1999@blue.com",                    
          CreatedAt = DateTime.Now,
          UpdatedAt = DateTime.Now,
          IsActive = true
        }
);//End User 1 Seed

次に、Addresses、Roles、UserRoles などの関連データを追加して、EF がテーブル間の接続を作成できるようにします。

context.UserRoles.AddOrUpdate(
        r => r.ID,        
        new Models.UserRole{
          UserID = 1,
          //etc
        },
        new Models.UserRole{
          UserID = 2,
          //etc
        },
}; //End roles seed

(注: これを行うには、UserID などのナビゲーション プロパティとモデル内のユーザー プロパティが必要です。これにより、EF は関連するユーザーを認識できます。上記の UserRole モデル/例のように)

于 2013-07-05T15:42:20.253 に答える