我正在创建一个MVC应用程序,我有3个实体,Year
,Week
和Day
。我在Week
和Day
中使用了复合键。
以下是模型,首先是Year
模型:
namespace Utility3.Models
{
public class Year
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key]
public int YearID { get; set; }
public virtual ICollection<Week> Weeks { get; set; }
}
}
Week
型号:
namespace Utility3.Models
{
public class Week
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key, Column(Order = 1)]
public int WeekID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key, Column(Order = 2)]
public int YearID { get; set; }
public virtual Year year { get; set; }
public virtual ICollection<Day> Days { get; set; }
}
}
Day
模型:
namespace Utility3.Models
{
public class Day
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key, Column(Order = 1)]
public int DayID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key, Column(Order = 2)]
public int WeekID { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
[Key, Column(Order = 3)]
public int YearID { get; set; }
public float Reading1 { get; set; }
public float Reading2 { get; set; }
public virtual Week Weeks { get; set; }
}
}
我的问题是关于使用html显示数据。在Week
控制器的索引页面中,代码底部有:
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
我不知道要为/* id=item.PrimaryKey */
部分添加什么。你如何使用复合键来解决这个问题呢?
答案 0 :(得分:0)
那是因为没有任何你可以放在那里工作的东西。如果您正在使用复合键,则需要传递所有键值,并将它们全部用于查找对象。
@Html.ActionLink("Edit", "Edit", new { yearId = item.YearID, weekId = item.WeekID, dayId = item.DayID })
这意味着你必须有一个可以接受这些参数的动作:
public ActionResult Edit(int yearId, int weekId, int dayId)
{
// do something
}
然后,当然,这是实现这一行动的途径:
routes.MapRoute(
"Foo",
"Foo/{action}/{yearId}/{weekId}/{dayId}",
new { controller = "Foo", action = "Index" }
);
当然,如果你只是不使用复合键,你的所有问题都会消失。没有充分的理由,它所做的只是增加代码的复杂性,如上所示。为什么在世界上我应该知道所有这些信息只是为了在表格中查找一行?只需给它一个标准的自动递增主键。此外,即使您坚持使用复合键,使用外键作为该组合键的组件也是一个很糟糕的想法。