2016-06-09 131 views
1

我有三个类实体框架的关系问题

public class SPR 
{ 
    public int ID { get; set; }  
    public string SubmittedBy { get; set; } 
    public virtual ICollection<SPRItem> AllItems { get; set; } 


} 
public class SPRItem 
{ 
    [Key] 
    public int ID { get; set; } 

    public string manufacturer { get; set; } 

    [ForeignKey("SPRItemDetails")] 
    public virtual SPRItemDetails ItemDetails { get; set; }  

    public string requestedMinimumQuantity { get; set; } 

    public virtual SPR SPR { get; set; } 

} 


public class SPRItemDetails 
    { 
     public int ID { get; set; } 

     public string ItemNumber { get; set; } 

     public virtual SPRItem SPRItem { get; set; } 


    } 

所以SPR类有SPRItem的集合,它具有ItemDetails对象。

我有一个Web API方法,它将数据映射到SPR对象并填充SPRItem列表和ItemDetails对象。但每当我试图首先使用实体​​框架代码来保存它,我得到这个错误

{"Message":"An error has occurred.","ExceptionMessage":"Unable to determine the principal end of an association between the types 'SharePoint.MultiSPR.Service.Models.SPRItemDetails' and 'SharePoint.MultiSPR.Service.Models.SPRItem'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations. 

这是我的上下文

public System.Data.Entity.DbSet<SharePoint.MultiSPR.Service.Models.SPR> SPRs { get; set; } 

    public System.Data.Entity.DbSet<SharePoint.MultiSPR.Service.Models.SPRItem> SPRItem { get; set; } 

    public System.Data.Entity.DbSet<SharePoint.MultiSPR.Service.Models.SPRItemDetails> SPRItemDetails { get; set; } 

有人可以告诉我如何正确配置关系。

谢谢

回答

0

在1:1的关系中,你总是必须指明主体和从属实体。主要实体是最相互独立的实体,在这种情况下,大概是SPRItem

要决定的下一件事是关系是否应该是可选的或必需的。我认为,从实体名称来看,如果没有SPRItemSPRItemDetails将永远不存在,所以关系是1:0..1(而不是0..1:0..1)。下面是如何配置:

modelBuilder.Entity<SPRItem>() 
      .HasOptional(si => si.ItemDetails) 
      .WithRequired(id => id.SPRItem); 

这将创建(或需要),具有一个主键,这也是一个外键SPRItemSPRItemDetails表。