MVC5:外键和数据访问

时间:2015-09-15 11:44:27

标签: asp.net-mvc entity-framework foreign-keys

我正在寻找根据另一张桌子从我的桌子中选择一个列表。我需要检索属于特定系统系列的系统名称。我已经添加了外键。我创建了一个包含这两个类的ViewModel,但它抛出了一个空指针异常。我是MVC的新手,我不确定我错在哪里。

模型类:系统  公共类系统     {

    public int SystemsID { get; set; }
    public string SystemName { get; set; }
    public DateTime CreatedOn { get; set;}
    public string CreatedBy { get; set; }
    public int SystemFamilyID { get; set; }

    public virtual SystemFamily SystemFamily { get; set; }
}

Class SystemFamily

  public class SystemFamily
{

    public int SystemFamilyID { get; set;}
    public int SystemsID {get;set;}
    public string FamilyName { get; set; }
    public DateTime DateCreated { get; set; }
    public string CreatedBy { get; set; }

    public virtual ICollection<Systems> Systems { get; set; }


 }

ViewSystem是我的SystemFamilyController中的一个方法。

   public ActionResult ViewSystem(int? id)
    {
        var viewmodel = new Sys_SysFam();
        ViewBag.SystemFamilyID = id.Value;
        //if (id != null)
        //{
        //    ViewBag.SystemFamilyID = id.Value;
        //    viewmodel.Systems = viewmodel.SystemFamily.Where(
        //        i => i.SystemFamilyID == id.Value).Single().Systems;
        //}

        return View(viewmodel);
    }

观点:

@model SystemFam_System.ViewModel.Sys_SysFam
@{
ViewBag.Title = "ViewSystem";
 }

 <h2>ViewSystem</h2>

 <p>@ViewBag.SystemFamilyID</p>
 <table>
 @foreach (var item in Model.Systems)
 {
    string selectedRow = "";
    if (item.SystemFamilyID == ViewBag.SystemFamilyID)
    {
        //{
        //    selectedRow = "success";
        //}

        <tr class="@selectedRow">
            <td>
                @item.SystemName
            </td>
            <td>
                @item.SystemsID
            </td>
            <td>
                @item.SystemFamily
            </td>
        </tr>

      }
  }
</table>

我得到空指针Exception。我想在视图系统中查看属于特定系列的系统。

提前致谢!! VINI

编辑:

public class Sys_SysFam
{
    public IEnumerable<Systems> Systems { get; set; }
    public SystemFamily SystemFamily { get; set; }
}

3 个答案:

答案 0 :(得分:1)

好的,我也检查了Sys_SysFam类。根据您当前的代码,它将始终在您使用的控制器代码中抛出空引用异常:

public ActionResult ViewSystem(int? id)
    {
        var viewmodel = new Sys_SysFam();
        ViewBag.SystemFamilyID = id.Value;
        //if (id != null)
        //{
        //    ViewBag.SystemFamilyID = id.Value;
        //    viewmodel.Systems = viewmodel.SystemFamily.Where(
        //        i => i.SystemFamilyID == id.Value).Single().Systems;
        //}

        return View(viewmodel);
    }

这里,您正在创建Sys_SysFam的对象作为viewmodel,并且您的if部分已被注释,因此您将返回viewmodel.Systems始终为null的相同viewmodel。在这里我没有看到任何数据库从db获取数据的请求,但我认为你的数据在viewmodel中将来自数据库,如果我取消注释你的if条件那么你也没有向数据库发送任何请求你正在使用相同的viewmodel对象创建以上。

viewmodel.Systems = viewmodel.SystemFamily.Where(
                    i => i.SystemFamilyID == id.Value).Single().Systems;

在右侧,您正在使用viewmodel.SystemFamily和where condition,但是当viewmodel.SystemFamily为null时,它将始终抛出异常。你的解决方案应该是这样的:

public ActionResult ViewSystem(int? id)
        {
            DataContext context = new DataContext();
            var viewmodel = new Sys_SysFam();
            ViewBag.SystemFamilyID = id.Value;
            if (id != null)
            {
                ViewBag.SystemFamilyID = id.Value;
                var sysFamily = context.SystemFamily.Include(x => x.Systems).FirstOrDefault(x => x.SystemFamilyID == id.Value);
                if (sysFamily != null)
                {
                    viewmodel.Systems = sysFamily.Systems;
                }
            }

            return View(viewmodel);
        }

这里首先我创建DataContext的对象,这是我使用实体框架访问数据库的主要上下文。所以首先我将基于从数据库传递的id来获得系统系列,如果系统族不是null,那么我将在viewmodel中设置系统的数据。 Include方法将从数据库中为基于系统族的系统带来数据。

同样改进你的Sys_SysFam类来初始化系统,这样当viewmodel.Systems中没有数据时它不会在你的视图中引发异常:

public class Sys_SysFam
    {
        public Sys_SysFam()
        {
            this.Systems = new List<Systems>();
        }

        public SystemFamily SystemFamily { get; set; }

        public IEnumerable<Systems> Systems { get; set; }
    }

希望这会对你有所帮助。

答案 1 :(得分:0)

select * from table(your_function(parm1, parm2, parm3));

答案 2 :(得分:0)

我的一个朋友可以找到我的方法。但它不使用任何ViewModel。我想知道如何使用ViewModel来完成它。

        public ActionResult ViewSystem(int? id)
        {

            var model = from item in db.Systems
                        orderby item.SystemsID
                        where item.SystemFamilyID == id
                        select item;
            return View(model);
        }