我使用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号码?
答案 0 :(得分:0)
当然可以!我认为问题在于您在一侧声明了导航属性(分配),但是您必须在两侧声明(部门也是如此)。
以下内容必须解决您的问题:
[MetadataType(typeof(DepartmentMetadata))]
public partial class Department
{
public Department()
{
this.Allocations = new HashSet<Allocation>();
}
// properties ...
public virtual ICollection<Allocation> Allocations { get; set; }
}