2016-04-05 56 views
1

使用實體框架在外鍵上掙扎(1對多關係)。類型'Class1'上屬性'MyField'上的ForeignKeyAttribute無效

的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)我fluentAPI嘗試: 第一次嘗試:

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

第二次嘗試:

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

2)無fluentAPI: 我宣佈有關Class2這樣的字段:

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

即使(這可能是沒有意義的):

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

我總是得到這樣的錯誤:

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.

任何想法有什麼不好?

thx提前。

回答

1

隨着你要定義一個單向的關係,所以正確的方法是你的流暢API配置:

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

MapKey方法用於當你不希望有外鍵的屬性您模型類。

使用ForeignKey屬性時,你所代表的FK列作爲你的實體的屬性:

public partial class Class1 
{ 

    public int Id { get; set; } 

    public int? Class2_Id{ get; set; } 

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

在這最後一種情況下,使用流暢API的關係配置是:

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

很好的解釋octavioccl。我非常感謝你! –

+0

不用客氣;) – octavioccl

相關問題