实体框架多对多关系返回Null

时间:2015-09-22 09:37:42

标签: c# entity-framework web-services rest azure

我使用带有MVC设计模式的Entity Framework 6.1.3开发并上传了一个Web服务。

所以,让我们想象一下,我有一个可以有很多客户的工作坊和一个可以有很多工作坊的客户。

到目前为止,我的结果是null,空值和有时正确的值,但没有关系(我的工作室内没有客户,反之亦然)。

这就是我现在所拥有的:

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; }
}

是的我同时有更多的关系。

由于仅此一点没有给我任何东西,我添加了一些Fluent 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;
}

2 个答案:

答案 0 :(得分:2)

看起来您没有使用延迟加载,或者当您通过API传递数据时该部分会丢失。确保告诉您的API包含子对象:

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

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

答案 1 :(得分: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; }