如何使用ASP.NET MVC4 / EF5脚手架与复合主键?

时间:2013-03-11 11:38:39

标签: asp.net-mvc-4 visual-studio-2012 entity-framework-5 composite-primary-key ef-database-first

我使用Visual Studio 2012(Web Express),我正在按照this nice guide by hector espinosa创建一个简单的ASP.NET MVC应用程序(使用Database-First方法)。我的问题是,对于使用复合主键的表,脚手架系统无法正常工作。

我的表格如下:

CREATE TABLE [dbo].[Unit](
    [UnitOid] [int] NOT NULL,
    /*other stuff*/
    [ReplicationId] [int] NOT NULL,
 CONSTRAINT [PK_Unit] PRIMARY KEY CLUSTERED 
(
    [UnitOid] ASC,
    [ReplicationId] ASC
)

脚手架生成控制器和视图,但是当我单击编辑或详细信息链接时,使用的唯一标识符是第一个(UnitOid)值。

控制器中的示例操作:

public ActionResult Details(int id = 0)
{
    Unit unit = db.Units.Find(id); // throws an ArgumentException
    if (unit == null)
    {
        return HttpNotFound();
    }
    return View(unit);
}

异常信息非常明确:

  

"传递的主键值的数量必须与数量匹配   在实体上定义的主键值"

MVC4 / EF5 / VisualStudio 2012的脚手架系统真的无法解决这个问题吗?

注意:此问题与this one非常相似。但是,我正在重新询问当前版本的工具。

1 个答案:

答案 0 :(得分:2)

由于您有复合键,因此需要提供两个值。请注意,Find采用参数属性,因此您只需执行db.Units.Find(id, id2)。如果您只有密钥的一部分,则需要查询数据库并期望多个结果,因为数据库中可能有许多实体,您提供的密钥部分是相同的。