我使用带有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;
}
答案 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; }