2011-04-05 91 views
1

我想設置一個導航屬性,將保存另一個表的零個或多個元素。實體框架似乎具有的問題是其他表具有複合主鍵。實體框架代碼第一個導航問題

public class Alpha 
{ 
    public int Id { get; set; } 
    public int? BetaId { get; set; } 
    public virtual ICollection<Beta> Beta { get; set; } 
    public string Name { get; set; } 
} 

public class Beta 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Id { get; set; } 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int SequenceNumber { get; set; } 
    public string Name { get; set; } 
} 

public class ABContext : DbContext 
{ 
    public DbSet<Alpha> Alpha { get; set; } 
    public DbSet<Beta> Beta { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Beta>() 
      .HasKey(b => new { b.Id, b.SequenceNumber }); 
    } 
} 

我不知道如何正確建立關係。我嘗試了幾個不同的東西。實體框架要麼抱怨不使用Beta類中的兩個鍵來定義導航屬性,要麼在Alphas表中創建一對沒有正確鏈接表的額外列。

目標是阿爾法應基於Beta.Id持有一套0或更多的貝塔。一個測試版可能屬於零個或多個阿爾法。但是,我對Beta到Alpha的關係並不感興趣。

任何想法?

+0

爲什麼不用[Key]屬性指定你的密鑰?即使你不感興趣,將Alpha屬性加入Beta也不會傷害任何人。 – Euphoric 2011-04-05 05:13:27

+0

我可以使用'[Key,Column(Order =#),...]',但它的作用與'.HasKey()'完全相同。添加'公共虛擬ICollection Alpha {get;組; }到類Beta創建一個BetaAlphas查找表。我只想設置'Alpha.BetaId'並自動獲取Betas的集合。 – sumpubu 2011-04-05 14:25:31

回答

1

因此,讓我們看看你的要求:

阿爾法應持設定的零和或多個貝塔....一個測試版可能屬於零個或多個阿爾法

這是很多一對多的關係,所以你必須映射它。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Beta>() 
     .HasKey(b => new { b.Id, b.SequenceNumber }); 

    modelBuilder.Entity<Alpha>() 
     .HasMany(a => a.Beta) 
     .WithMany(); 
} 

這將與trhee列(大概叫Alpha_Id,Beta_Id和Beta_SequenceNumber)數據庫中創建額外表。

我還是不會不知所措,你的意思是基於Beta.Id。如果alpha只能保存具有相同Beta.Id的記錄,則可能必須在應用程序邏輯中控制這些記錄。這是需要通過映射強制執行的其他複雜構造的東西。

+0

Beta中的Id屬性本質上是一個組ID。 Alpha對象可能有一組特定的Beta對象。我試圖避免查找表,因爲我有242組中的700,000多個Alpha對象和120,000多個Beta對象。 – sumpubu 2011-04-05 18:17:29

+2

你不會避免查找表,因爲你的關係需要它。 – 2011-04-05 18:22:46

+0

我嘗試了幾種不同的方法,但沒有奏效。我最終將Beta查找移動到存儲庫並添加了'modelBuilder.Entity ().Ignore(a => a.Beta);'。這會阻止EF添加額外的列或查找表。唯一的缺點是現在必須手動填寫Beta版本。 – sumpubu 2011-04-06 14:07:54

相關問題