2015-09-22 51 views
0

我使用帶有MVC設計模式的實體框架6.1.3開發並上傳了一個Web服務到Azure。實體框架多對多關係返回空

因此,讓我們假設我有一個可以有許多客戶和一個可以有許多研討會的客戶的研討會。

到目前爲止,我的結果已爲空,空值和有時正確的值,但沒有關係(我的工作室內沒有客戶,反之亦然)。

這是我在這一點上:

public class Workshop 
{ 
    public Workshop() 
    { 
     this.Clients = new HashSet<Client>(); 
     this.ModuleSets = new HashSet<ModuleSet>(); 
    } 

    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public virtual ICollection<Client> Clients { get; set; } 
    public virtual ICollection<ModuleSet> ModuleSets { get; set; } 
} 

public class Client 
{ 
    public Client() 
    { 
     this.Workshops = new HashSet<Workshop>(); 
     this.Vehicles = new HashSet<Vehicle>(); 
    } 

    public int Id { get; set; } 
    [Required] 
    public string Name { get; set; } 

    public virtual ICollection<Workshop> Workshops { get; set; } 
    public virtual ICollection<Vehicle> Vehicles { get; set; } 
} 

是的,我有更多的關係,同時繼續。

由於單獨沒有給我什麼,我加了一些流利的API,像這樣:

modelBuilder.Entity<Workshop>(). 
      HasMany(c => c.Clients). 
      WithMany(p => p.Workshops). 
      Map(
       m => 
       { 
        m.MapLeftKey("Workshop_Id"); 
        m.MapRightKey("Client_Id"); 
        m.ToTable("WorkshopClients"); 
       }); 

所顯示的名稱是在表中WorkshopClients(由實體框架自動生成)中的那些。

我也讀過這篇文章,以確保我在Fluent API上做的正確。

How to define Many-to-Many relationship through Fluent API Entity Framework?

這是我在客戶端上簡單的要求:

var request = new RestRequest("api/Workshops") { Method = Method.GET }; 
var workshopList = await api.ExecuteAsync<List<Workshop>>(request); 

API /工作坊方法:

// GET: api/Workshops 
public IQueryable<Workshop> GetWorkshops() 
{ 
    return db.Workshops; 
} 
+0

也許在'api/Workshops'方法中顯示代碼? – DavidG

+0

@DavidG更新後,謝謝! – Mike

回答

0

我推薦你把你的映射在一個單獨的映射文件,但如果你打算在OnModelCreating方法中做到這一點,那麼這應該做你所需要的。

modelBuilder.Entity<Workshop>() 
     .HasRequired(c => c.Clients) //or HasOptional depending on your setup 
     .WithMany(d => d.Workshop) 
     .HasForeignKey(d => new { d.ID }); 

    modelBuilder.Entity<Clients>() 
     .HasRequired(c => c.Workshop) //same 
     .WithMany(d => d.Clients) 
     .HasForeignKey(d => new { d.ID }); 

Also in both entities add this to your ID properties: 

[Key] 
public int Id { get; set; } 
+0

這不適合我,看來我必須在使用.WithMany語句之前添加一個.HasMany語句。 – Mike

+0

看來,使用該設置,我無法在.WithMany(d => d.Clients)或.WithMany(d => d.Workshop)中找到任何屬性。我確實糾正了一些與複數和區分大小寫的問題有關的事情。 – Mike

+0

在你的實體中,你可以在兩個ID中加上[key]。映射需要知道你的主鍵和外鍵是什麼。 –

1

看起來好像沒有使用延遲加載,或者在通過API傳遞數據時該部分丟失。請確保你告訴你的API,包括兒童對象:

public IQueryable<Workshop> GetWorkshops() 
{ 
    return db.Workshops 
     .Include(w => w.Clients); 
} 

注意:您可能需要添加using System.Data.Entity;使用的Include拉姆達版本,否則,你可以使用字符串版本。

+0

而不是空結果,我現在得到一個結果,但具有空/空屬性。 – Mike