我正在尝试使用ASP MVC 4和Entity Framework 4来创建非常简单的网站。 我需要使用迁移功能,因为我将应用程序部署到共享主机(GoDaddy),我不想在每次更改时手动更改表。
建立一对多关系的正确方法是什么?使用其他实体类型或其他实体的主键类型?
当我使用其他实体类型时,这是首选,因为它使模型更清晰,迁移工具有效,但ASP MVC的脚手架没有。即使我手动添加下拉选择其他实体,ASP MVC也没有解析请求权限,也没有设置其他实体属性。
这是两个选项:
选项1:使用其他实体类型。
public class Tenant {
[Key]
public string TenantID { get; set; }
public string Name { get; set; }
}
public class Survey {
[Key]
public string SurveyID { get; set; }
[Required]
public Tenant Tenant { get; set; }
[Required]
[StringLength(100, MinimumLength=5)]
public string Title { get; set; }
[Required]
public DateTime CreatedAt { get; set; }
}
选项2:使用主键类型。
public class Tenant {
[Key]
public string TenantID { get; set; }
public string Name { get; set; }
}
public class Survey {
[Key]
public string SurveyID { get; set; }
[Required]
public string TenantID { get; set; }
[Required]
[StringLength(100, MinimumLength=5)]
public string Title { get; set; }
[Required]
public DateTime CreatedAt { get; set; }
}
我在ASP MVC 4项目中为Survey实体创建了带脚手架的MVC控制器。它创建CRUD控制器和视图。在视图中,它没有为租户设置任何字段。 在我自己添加之后,调用了Create(Tenant tenant)方法,但是HTML表单发送的Tenant字段没有被MVC解析,也没有设置Survey实体的Tenant字段。
伊
答案 0 :(得分:1)
这些看起来像是映射一对一关系而不是一对多关系。如果一项调查可以有多个租户,那么:
public class Tenant {
[Key]
public string TenantID { get; set; }
public string Name { get; set; }
public virtual Survey Survey {get; set;}
}
public class Survey {
[Key]
public string SurveyID { get; set; }
[Required]
[StringLength(100, MinimumLength=5)]
public string Title { get; set; }
[Required]
public DateTime CreatedAt { get; set; }
public virtual ICollection<Tenant> Tenant {get; set;}
}
答案 1 :(得分:-1)
我发现this series of posts解释了如何制作EF模型,以便它们可以与EF和ASP MVC一起使用。 我们的想法是同时拥有“普通”引用类型和强引用类型。
public class Team
{
public int TeamId { get; set; }
// ... other Team properties go here
// Each Team has an optional "next opponent" which is another Team
public int? NextOpponentId { get; set; }
[ForeignKey("NextOpponentId")] public virtual Team NextOpponent { get; set; }
// Each Team also has a required Manager and Administrator, both of which are people
public int ManagerId { get; set; }
public int AdministratorId { get; set; }
[ForeignKey("ManagerId")] public virtual Person Manager { get; set; }
[ForeignKey("AdministratorId")] public virtual Person Administrator { get; set; }
}