2013-07-05 6 views
0

J'ai de nombreuses relations dans lesquelles j'essaie de semer en utilisant l'approche du code dans Entity Framework. Seule la couche supérieure est en réalité en train de semer les données correctement. La classe d'utilisateur est en train de semer mais les listes sous-jacentes d'objets ne le sont pas. Mon de Poco sont les suivantes:Relations complexes Entity Framework Seed, méthode

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

    } 

La méthode de semences que j'ai construit comme suit:

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

Encore une fois les données utilisateur se propage dans la base de données correctement, cependant, toutes les listes d'objets sous-jacents ne sont pas propagation dans la base de données du tout. Toutes les tables arrivent comme prévu. La classe Context est la suivante.

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

    } 

La base de données telle qu'elle se présente ressemble à ceci.

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 

Les adresses et autres tables d'objets n'ont aucune valeur insérée.

Toute aide est grandement appréciée !! Merci encore les gars.

,

J

Répondre

2

Je proposerais cette approche en pièces:

Ajoutez votre utilisateur

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 

puis ajoutez les données connexes comme les adresses, rôles, etc. UserRoles laissant EF établit les connexions entre les tables:

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

(Remarque: Pour ce faire, vous devez disposer de propriétés de navigation telles que UserID et d'une propriété User dans le modèle afin qu'EF sache à quel utilisateur se connecter. Comme dans le modèle UserRole/exemple ci-dessus)

+0

Cette approche a bien fonctionné. Je vous remercie. Des idées sur la question de savoir si cela serait ou non considéré comme une bonne pratique? – user1345632

+0

Je l'aime parce que c'est assez modulaire et je peux facilement localiser et changer la graine pour une table particulière. En ce qui concerne les meilleures pratiques, cela semble être une question pour [Programmer Stack Exchange] (http://programmers.stackexchange.com/). – holbrookbw1

Questions connexes