0

Ich befolge den EF6-Code zunächst begehbar, und habe versucht, ihn leicht an mein eigenes Projekt anzupassen, aber ich habe ein Problem beim Seeding der Datenbank mit der Initialisierer.EF6 Seeding über Initialisierer und One-to-Many ICollection

Ich habe 2 Klassen erstellt:

Eine Eigenschaft Modus:

namespace MyApp.Models 

{ 
    public class Property 
    { 
     public int ID { get; set; } 
     public string PropertyName { get; set; } 

     public virtual PropertyType PropertyType { get; set; } 
    } 
} 

und ein Objekttyp-Modus:

namespace MyApp.Models 
{ 
    public class PropertyType 
    { 
     public int ID { get; set; } 
     public string Type { get; set; } 

     public ICollection<Property> Properties { get; set; } 
    } 
} 

Mein Verständnis ist, dass es eine Eins-zu-viele Beziehung zwischen diesen 2. Eine Eigenschaft kann nur 1 Eigenschaftstyp sein, aber viele Eigenschaften können die gleichen Eigenschaftstypen haben?

aber wenn ich versuche, den Kontext zu initialisieren und die Datenbank (mit dem Code unten) Samt, bekomme ich einen Fehler:

public class MyAppInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<MyAppContext> 
{ 
    protected override void Seed(MyAppContext context) 
    { 
     var propertytypedata = new List<PropertyType> 
     { 
      new PropertyType {ID = 1, Type="Villa" }, 
      new PropertyType {ID = 2, Type="Apartment" } 
     }; 

     propertytypedata.ForEach(p => context.PropertyType.Add(p)); 
     context.SaveChanges(); 

     var propertydata = new List<Property> 
     { 
      new Property {PropertyName="Property 1", PropertyType=1, } 
     }; 

     propertydata.ForEach(p => context.Property.Add(p)); 
     context.SaveChanges(); 
    } 
} 

Das Problem ist, dass, wenn ich versuche, den Objekttyp auf einstellen Eigentum ich bin Impfen, sagt es:

Cannot implicitly convert type 'int' to 'MyApp.Models.PropertyType'

+0

'PropertyType = 1,'. PropertyType ist ein komplexes Objekt, keine Ganzzahl. –

Antwort

1

Beispiel:

protected override void Seed(MyAppContext context) 
    { 
     var propertytypedata = new List<PropertyType> 
     { 
      new PropertyType {ID = 1, Type="Villa" }, 
      new PropertyType {ID = 2, Type="Apartment" } 
     }; 

     foreach(var propertyType in propertytypedata){     
      propertyType.Properties = new List<Property> 
      { 
       new Property {PropertyName="Property 1", PropertyType = propertyType, } 
      }; 
      context.PropertyType.Add(propertyType) 
     } 

     context.SaveChanges(); 
    } 

Sie brauchen nicht zwei separat e fügt hinzu. Entity Framework fügt die Untersammlung zur Datenbank hinzu. Wenn Sie jetzt auf diesen propertyType zugreifen, werden die Eigenschaften bereits als Untersammlung geladen, wenn Sie ICollection<Property> Properties als virtual markieren, andernfalls müssen Sie include() beim Laden laden.