2013-07-05 4 views
0

У меня есть несколько-много отношений, в которых я пытаюсь использовать Seed, используя первый подход кода в Entity Framework. Только самый верхний слой фактически правильно загружает данные. Класс пользователя поселяется, но базовые списки объектов - нет. Мой Poco являются следующие:Сложные отношения Entity Framework Seed Method

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 = "[email protected]", 
        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* [email protected] 2013-07-04 19:34:46.767 2013-07-04 19:34:46.767 1 

Адреса и другие таблицы объектов не имеют вставленных значений.

Любая помощь очень ценится !! Еще раз спасибо ребятам.

,

J

ответ

2

Я хотел бы предложить приближаемся это в кусках:

Добавить пользователя

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

Затем добавить соответствующие данные, такие как Адреса, роли, UserRoles и т.д. выпускающих EF установить соединения между таблицами:

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

(Примечание: для этого вам нужны свойства навигации, такие как UserID и свойство User в модели, поэтому EF знает, к какому пользователю относится. Как и в модели UserRole/пример выше)

+0

Этот подход работал хорошо. Спасибо. Любые идеи о том, будет ли это считаться лучшей практикой? – user1345632

+0

Мне это нравится, потому что он довольно модульный, и я могу легко найти и изменить семя для конкретной таблицы. Что касается лучшей практики, это похоже на вопрос для [Programmer Stack Exchange] (http://programmers.stackexchange.com/). – holbrookbw1

Смежные вопросы