ViewModel用于表之间没有链接的多个表

时间:2017-12-06 12:18:34

标签: asp.net-mvc

我试图在ASP.NET MVC5项目中编写一个视图模型,以显示用户可以编辑和保存的表单上不同表的数据。我使用以下内容: -

VS 2017,c#,MySQL数据库,实体框架6.1.3,MySQL连接器6.9.9,数据库中的代码优先(现有数据库,我无法改变)

更复杂的是,数据库中的表之间没有链接,所以我无法弄清楚如何创建一个合适的视图模型,然后允许我保存更改。

以下是4个表格模型: -

public partial class evc_bearer
{
    [Key]
    [Column(Order = 0]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long evcid { get; set; }

    [Key]
    [Column(Order = 1]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public long bearerid { get; set; }

    public int vlan { get; set; }

    [Column("ref")]
    public string _ref { get; set; }

    [Required]
    public string port { get; set; }

    [Required]
    public string endpoint { get; set; }
}



    public partial class bearer
{
    [Key]
    public long id { get; set; }

    [Column("ref")]
    [Required]
    public string _ref { get; set; }

    public string name { get; set; }

    public long? site { get; set; }

    public long? provider { get; set; }

    public long? mtu { get; set; }

    public float? rental { get; set; }

    public int? offsiteprovider { get; set; }

    public float? offsiteproviderrental { get; set; }

    public bool? aend { get; set; }

    public int? equipmentport { get; set; }

    public string orderref { get; set; }

    public string offsiteref { get; set; }

    public string notes { get; set; }

    public float? bookingfactor { get; set; }
}

public partial class evc
{
    [Key]
    public long id { get; set; }

    [Required]
    public string type { get; set; }

    public byte servicetype { get; set; }

    public byte cos { get; set; }

    public int cir { get; set; }

    public int pir { get; set; }

    public bool burst { get; set; }

    [Column("ref")]
    public string _ref { get; set; }

    public string orderref { get; set; }

    public byte state { get; set; }

    public string notes { get; set; }

    public float? rental { get; set; }
}

    public partial class evc_provider
{
    [Key]
    public long id { get; set; }

    [Required]
    public string provider { get; set; }
}

这是我试过写的视图模型: -

public partial class evcBearersVM
{
    [Key]
    [Column(Order = 0)]
    public long evcid { get; set; }

    [Key]
    [Column(Order = 1)]
    public long id { get; set; }

    [Column("ref")]
    public string b_ref { get; set; }

    public string b_name { get; set; }

    public string ep_provider { get; set; }

    public int eb_vlan { get; set; }

    public string eb_port { get; set; }

    public string eb_endpoint { get; set; }
}

这是我用来填充视图模型的Linq查询: -

IQueryable<evcBearersVM> data = from eb in csdb.evc_bearers
    join b in csdb.bearers on eb.bearerid equals b.id
    join ep in csdb.evc_providers on b.provider equals ep.id
    join e in csdb.evcs on eb.evcid equals e.id
    where (eb.evcid == evcid && b.id == id)
    select new evcBearersVM
    {
        evcid = eb.evcid,
        id = b.id,
        b_ref = b._ref,
        b_name = b.name,
        ep_provider = ep.provider,
        eb_vlan = eb.vlan,
        eb_port = eb.port,
        eb_endpoint = eb._ref
    };

因此查询工作并加入表以获取我需要的数据,我可以根据需要在各种视图中显示此日期。我现在需要做的是能够编辑一行并将其保存回数据库。我有一个编辑视图,显示我需要的数据,但我不知道如何保存更改,因为它是一个视图模型,而数据库上下文并不知道它。感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

你应该做的是,使用与你的HttpPost动作方法参数相同的视图模型,并在动作方法中,使用Id读取你想要更新的实体(你可以从视图模型中得到这个,假设你的表单是提交那些)并仅更新您需要更新的属性。

[HttpPost]
public ActionResult Edit(evcBearersVM model)
{
    var b = csdb.bearers.FirstOrDefault(a=>a.id==model.id);
    if(b!=null)
    {
       b.name = model.b_name; 
       b._ref = model.b_ref;
       csdb.SaveChanges();
    }
    // Update the other entity as well.

    return RedirectToAction("Index");
}