Asp.net mvc 4 MVC首先从数据库编辑模型关系

Asp.net mvc 4 MVC首先从数据库编辑模型关系,asp.net-mvc-4,Asp.net Mvc 4,使用数据库优先建模方法使用MVC5构建web应用程序。不幸的是,我正在构建的现有数据库有一个缺少外键约束的表,该表有额外的主键,并且通常格式不好。因此,当我构建MVC模型时,它无法自动生成表之间所有必要的多对多关系。我无法更改原始表的定义 我发现了通过MVC模型图和模型浏览器创建新关联的能力,但它似乎只允许我关联表,而不允许指定连接表的字段。当我更新模型时,我得到了关于我创建的关联的错误,没有映射,没有任何细节 我能找到的所有database first建模示例都是从格式良好、名称良好的表开始的

使用数据库优先建模方法使用MVC5构建web应用程序。不幸的是,我正在构建的现有数据库有一个缺少外键约束的表,该表有额外的主键,并且通常格式不好。因此,当我构建MVC模型时,它无法自动生成表之间所有必要的多对多关系。我无法更改原始表的定义

我发现了通过MVC模型图和模型浏览器创建新关联的能力,但它似乎只允许我关联表,而不允许指定连接表的字段。当我更新模型时,我得到了关于我创建的关联的错误,没有映射,没有任何细节

我能找到的所有database first建模示例都是从格式良好、名称良好的表开始的,但现实生活中并不总是这样

有人能给我解释一下或者给我指一个链接,关于如何先从数据库模型开始,然后修复问题或者定义缺失的部分,这样MVC模型才能正确构建吗


或者对于这个表,我应该直接对类进行建模?我唯一不明白的是,我在哪里定义了导航属性的详细信息,以便模型知道要连接哪些表和字段。

根据上面的注释,我最终确定了一种更好的方法,为现有数据库创建一个MVC应用程序,该数据库的设计可能与您希望的模型布局方式不同

我使用CodeFirst方法直接定义模型类,而不是从现有数据库生成它们。然后,使用实体框架映射属性,将每个类及其各个属性映射到现有的表和字段。这使我可以按照自己的意愿定义类,为它指定所需的属性名称,并定义数据库中可能未定义的外键

下面是一些我创建的映射到现有数据库表的类的示例

[Table("uofs00137_contacts")]
public partial class Contact
{
    [Key]
    [Column("id")]
    public int ID { get; set; }

    [Column("first_name")]
    [StringLength(30)]
    [Display(Name = "First Name")]
    public string FirstName { get; set; }

    [Column("last_name")]
    [StringLength(30)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }

    [Column("organisation")]
    [StringLength(30)]
    [Display(Name = "Organization")]
    public string Organization { get; set; }

    [Column("title")]
    [StringLength(30)]
    [Display(Name = "Job Title")]
    public string JobTitle { get; set; }

    [Column("email")]
    [StringLength(40)]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Column("status_code")]
    [StringLength(1)]
    [Required]
    [Display(Name = "Contact Status Code")]
    public string StatusCode { get; set; }

    [Display(Name = "Full Name")]
    public string FullName
    {
        get
        {
            return FirstName + " " + LastName;
        }
    }

    public virtual ICollection<DepartmentContact> DepartmentContacts { get; set; }
}

[Table("uofs00137_dept_contacts")]
public partial class DepartmentContact
{
    [Key]
    [Column("id")]
    public int ID { get; set; }

    [Column("department_code")]
    [StringLength(7)]
    [ForeignKey("VirtualDepartment")]
    [Display(Name = "Department Code")]
    public string DepartmentCode { get; set; }

    [Column("contact_id")]
    [ForeignKey("Contact")]
    [Display(Name = "Contact ID")]
    public int ContactID { get; set; }

    [Column("status_code")]
    [StringLength(1)]
    [Required]
    [Display(Name = "Department Contact Status Code")]
    public string StatusCode { get; set; }

    [Display(Name = "Department Contact Status")]
    public string StatusDesc
    {
        get
        {
            if (StatusCode == "I")
                return "Inactive";
            else if (StatusCode == "A")
                return "Active";
            else
                return "Unknown Status";
        }
    }

    public virtual VirtualDepartment VirtualDepartment { get; set; }
    public virtual Contact Contact { get; set; }
}
[表格(“uofs00137\U联系人”)]
公共部分类接触
{
[关键]
[列(“id”)]
公共int ID{get;set;}
[列(“名字”)]
[行政长官(30)]
[显示(Name=“First Name”)]
公共字符串名{get;set;}
[列(“姓氏”)]
[行政长官(30)]
[显示(Name=“Last Name”)]
公共字符串LastName{get;set;}
[栏目(“组织”)]
[行政长官(30)]
[显示(Name=“组织”)]
公共字符串组织{get;set;}
[栏目(“标题”)]
[行政长官(30)]
[显示(Name=“职务”)]
公共字符串JobTitle{get;set;}
[栏目(“电子邮件”)]
[行政长官(40)]
[显示(Name=“电子邮件”)]
公共字符串电子邮件{get;set;}
[列(“状态代码”)]
[第(1)款]
[必需]
[显示(Name=“联系人状态代码”)]
公共字符串状态码{get;set;}
[显示(Name=“全名”)]
公共字符串全名
{
得到
{
返回FirstName+“”+LastName;
}
}
公共虚拟ICollection部门联系人{get;set;}
}
[表(“uofs00137部门联系人”)]
公共部分课程部门联系人
{
[关键]
[列(“id”)]
公共int ID{get;set;}
[栏(“部门代码”)]
[第(7)款]
[外键(“虚拟部门”)]
[显示(名称=“部门代码”)]
公共字符串部门代码{get;set;}
[列(“联系人id”)]
[外键(“联系人”)]
[显示(姓名=“联系人ID”)]
public int ContactID{get;set;}
[列(“状态代码”)]
[第(1)款]
[必需]
[显示(Name=“部门联系人状态代码”)]
公共字符串状态码{get;set;}
[显示(Name=“部门联系人状态”)]
公共字符串StatusDesc
{
得到
{
如果(状态代码==“I”)
返回“不活动”;
else if(状态代码==“A”)
返回“活动”;
其他的
返回“未知状态”;
}
}
公共虚拟虚拟部门虚拟部门{get;set;}
公共虚拟联系人联系人{get;set;}
}
通过DbContext类与数据库建立连接:

 public partial class AccountingAdminEntities : DbContext
{
    public AccountingAdminEntities() : base("name=AccountingAdminEntities")
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // This is necessary so that as you add new items to the context
        // you don't get the following exception:
        //   The model backing the AccountingAdminEntities context has
        //   changed since the database was created. Consider using Code
        //   First Migrations to update the database.
        Database.SetInitializer<AccountingAdminEntities>(null);
        base.OnModelCreating(modelBuilder);
    }

    public virtual DbSet<Contact> Contacts { get; set; }
    public virtual DbSet<DepartmentContact> DepartmentContacts { get; set; }
}
公共部分类AccountingAdministries:DbContext
{
public accountingadmin():base(“name=accountingadmin”)
{
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
//这是必要的,以便在向上下文添加新项时
//您不会得到以下异常:
//支持AccountingAdministrations上下文的模型
//自创建数据库以来更改。请考虑使用代码
//首先迁移以更新数据库。
Database.SetInitializer

在这里:

我发现这是一种数据库/代码优先的混合方法。另一种方法是先在现有数据库()上使用完整的EF代码,然后使用Fluent API配置EF()。