具有复合键的MVC4导航属性

时间:2013-02-01 22:17:00

标签: asp.net-mvc-4 composite-key navigation-properties ef-database-first

我使用EF-database-first创建了一个MVC4 Web应用程序。这些表具有复合键[ID,Name,EffDate],并且数据库中没有定义外键: 例如,Department partial class:

[MetadataType(typeof(DepartmentMetadata))]
public partial class Department
{
    public int DeptID { get; set; }
    public string DeptName { get; set; }
    public System.DateTime EffDate { get; set; }
    public string Status { get; set; }
    public string RevenueAccount { get; set; }
}

部门元数据类:

public class DepartmentMetadata
{
    [Required]
    public int DeptID { get; set; }

    [Required]
    [Display(Name = "Department Name")]
    public string DeptName { get; set; }

    [Required]
    [Display(Name = "Effective Date")]
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", NullDisplayText = "--", ConvertEmptyStringToNull = true)]
    public System.DateTime EffDate { get; set; }

    [Required]
    public string Status { get; set; }

    [Display(Name = "Revenue Account")]
    [StringLength(10)]
    public string RevenueAccount { get; set; }
}

Allocation表,引用Department表。它还有一个复合键[DeptID,ProjectID,BillableUnitID,EffDate]。如果可以的话,我会将DeptID字段声明为外键...但我不控制数据库,更重要的是我相信T-SQL不允许外键部分复合键:

[MetadataType(typeof(AllocationMetadata))]
public partial class Allocation
{
    public int DeptID { get; set; }
    public int ProjectID { get; set; }
    public int BillableUnitID { get; set; }
    public System.DateTime EffDate { get; set; }
    public string Status { get; set; }
    public decimal Allocation1 { get; set; }
}

这样可行,但我得到了一列DeptID号码。我想要的是一系列部门名称。

之前的question指示我使用虚拟导航属性,因此我添加了它们:

[MetadataType(typeof(AllocationMetadata))]
public partial class Allocation
{
    [ForeignKey("Department")]
    public int DeptID { get; set; }
    public int ProjectID { get; set; }
    public int BillableUnitID { get; set; }
    public System.DateTime EffDate { get; set; }
    public string Status { get; set; }
    public decimal Allocation1 { get; set; }

    public virtual Department Department { get; set; } /* navigation property */
}

Index的AllocationController中的代码是:         公共ActionResult索引()         {             return View(db.Allocation.Include(a => a.Department).ToList());         }

当我点击分配索引视图的链接时,我收到此错误消息(在我停止调试之后):

  

' /'中的服务器错误应用

     

指定的包含路径无效。 EntityType   ' KC_BillableUnit_TESTModel.Allocation'不声明导航   名称为' Department'。

的财产      

堆栈跟踪   [InvalidOperationException:指定的   包含路径无效。 EntityType   ' KC_BillableUnit_TESTModel.Allocation'不声明导航   名称为' Department'。]的财产   System.Data.Objects.Internal.ObjectFullSpanRewriter.ConvertSpanPath(SpanPathInfo   parentInfo,List`1 navPropNames,Int32 pos)+8355128
  System.Data.Objects.Internal.ObjectFullSpanRewriter..ctor(DbCommandTree   tree,DbExpression toRewrite,Span span)+256   .... ....继续

我尝试了各种注释组合,但都会导致同样的错误。

如何让我的分配列表显示部门名称而不是DeptID号码?

1 个答案:

答案 0 :(得分:0)

当然可以!我认为问题在于您在一侧声明了导航属性(分配),但是您必须在两侧声明(部门也是如此)。

以下内容必须解决您的问题:

[MetadataType(typeof(DepartmentMetadata))]
public partial class Department
{
    public Department()
    {
        this.Allocations = new HashSet<Allocation>();
    }

    // properties ...

    public virtual ICollection<Allocation> Allocations { get; set; }
}