繁体   English   中英

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

[英]Entity Framework Many to Many Relationship returning Null

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

因此,让我们假设我有一个可以拥有许多客户的研讨会和一个可以拥有许多研讨会的客户。

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

这就是我现在所拥有的:

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时做的正确。

如何通过Fluent API实体框架定义多对多关系?

这是我对客户的简单要求:

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

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

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

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

我建议将映射保存在单独的映射文件中,但如果要在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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM