2016-04-05 8 views
1

Mit Entity Framework auf einen Fremdschlüssel stoßen (Beziehung zwischen 1 und vielen).Das ForeignKeyAttribute für die Eigenschaft 'MyField' vom Typ 'Class1' ist nicht gültig.

class1:

public partial class Class1 
    { 

     public int Id { get; set; } 
     [ForeignKey("Class2_Id")] 
     public Class2 Class2{ get; set; } 
...} 

Class2: 
public partial class Class2 
    { 

     public int Id { get; set; } 
     public virtual ICollection<Class1> Stuff{ get; set; } 
...} 

1) I mit fluentAPI versucht: 1. Versuch:

modelBuilder.Entity<Class2>().HasMany<Class1>(p => p.Stuff).WithOptional().Map(m => m.MapKey("Class2_Id")).WillCascadeOnDelete(); 

2. Versuch:

modelBuilder.Entity<Class1>().HasRequired(i => i.Class2).WithMany().Map(m => m.MapKey("Class2_Id")); 

2) ohne fluentAPI: Ich erklärte die betroffen Class2 Feld auf diese Weise:

[Column("Class2")] 
public int Id { get; set; } 

Selbst (das macht wohl keinen Sinn):

[ForeignKey("Class2")] 
public int Id { get; set; } 

ich immer diese Fehlermeldung erhalten:

The ForeignKeyAttribute on property 'Class2' on type 'Class1' is not valid. The foreign key name 'Class2_Id' was not found on the dependent type 'Class1'. The Name value should be a comma separated list of foreign key property names.

Jede Idee, was falsch ist?

THX im Voraus.

Antwort

1

Mit Ihrer fließend api Konfigurationen Sie eine unidirektionale Beziehung definieren, so ist der richtige Weg wäre:

modelBuilder.Entity<Class2>().HasMany(p => p.Stuff) 
          .WithOptional(c=>c.Class2) 
          .Map(m => m.MapKey("Class2_Id")) 
          .WillCascadeOnDelete(); 

MapKey Methode wird verwendet, wenn Sie den Fremdschlüssel als eine Eigenschaft haben, nicht wollen, in Ihrem Modellklasse.

Verwenden ForeignKey Attribut, wenn Sie stellen die FK-Spalte als Eigenschaft Ihres Unternehmens:

public partial class Class1 
{ 

    public int Id { get; set; } 

    public int? Class2_Id{ get; set; } 

    [ForeignKey("Class2_Id")] 
    public Class2 Class2{ get; set; } 
} 

In diesem letzten Fall Ihre Beziehung Konfiguration Fluent Api mit wäre:

modelBuilder.Entity<Class2>().HasMany(p => p.Stuff) 
          .WithOptional(c=>c.Class2) 
          .HasForeignKey(c=>c.Class2_Id)) 
          .WillCascadeOnDelete(); 
+0

Große Erklärung octavioccl. Ich danke dir! –

+0

Gern geschehen;) – octavioccl