我应该如何建模与EntityFramework 4的一对多关系以使用迁移和ASP MVC

时间:2012-08-05 10:31:53

标签: entity-framework

我正在尝试使用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字段。

2 个答案:

答案 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; }
}