2012-08-12 93 views
3

我是ASP.net MVC的新手。我正在尝试创建一个视图模型来显示数据连接。下面是一些示例代码:如何正确使用视图模型

public class Person 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Name { get; set; } 

    public ICollection<Relative> Relatives { get; set; } 

} 

public class Relative 
{ 
    [Key] 
    public int ID {get; set; } 
    public Person Person { get; set; } 
    public RelationType RelationType { get; set; } 
} 

public class RelationType 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Description { get; set; } 
} 

public class PersonViewModel 
{ 
    public string Name { get; set; } 
    public ICollection<string> RelativeNames { get; set; } 
    public ICollection<string> RelativeTypes { get; set; } 
} 

public class PersonContext : DbContext 
{ 
    public DbSet<PersonViewModel> people { get; set; } 
} 

当我尝试创建通过Visual Studio我的控制,我得到以下错误:

无法检索元数据PersonViewModel。在生成期间检测到一个或多个验证错误: EntityType'PersonViewModel'没有定义密钥。定义此EntityType的关键字。

回答

3

错误是不言自明的。您需要在PersonViewModel中添加一个Id字段,该字段必须用[Key]修饰,正如您在上述类中正确完成的那样。

+0

啊。我只是困惑。我从来没有用主键指定视图;我在考虑SQL Server视图。 – 2012-08-13 00:42:41

+2

哦,ViewModel绝对不是Domain Model。看到[做viewmodels需要键?](http://stackoverflow.com/questions/20816115/do-viewmodels-need-keys) – Aigori 2014-08-21 15:22:04

1

查看模型是便于在控制器和视图之间传递数据的类。你得到这个异常的原因是因为你正在将PersonViewModel类传递到你的dbSet中。除非PersonViewModel类具有相应的表格,否则不能这样做。在这种情况下,PersonViewModel不应该是一个视图模型,而应该是一个实体,一个模型类来表示你的表格。

通过看你的代码,我猜你有个人在你的数据库中的表相对 因此你务必做好以下

public class PersonContext : DbContext 
{ 
    public DbSet<Person> Person { get; set; } 
    public DbSet<Relative> Relative { get; set; } 

} 

,并通过人与你的DbContext类的相对性填充PersonViewModel。这可以在控制器内部或存储库类中完成,如果有的话。

+0

我试图使用Code First来生成表。我有或没有布局可能吗? – 2012-08-13 00:14:35

+0

是的,你有正确的代码。请看这里的例子http://msdn.microsoft.com/en-us/data/gg685467.aspx – haroonxml 2012-08-13 00:16:40

+0

我遇到了类似的问题。您的链接显示了如何创建模型,控制器,DbContext以及如何创建脚手架的示例。我无法看到这与创建ViewModel如何与每个问题相关。我错过了什么吗? – Gravy 2013-06-07 10:58:45

相关问题