MVC-无法在实体上设置字段/属性

时间:2019-06-11 23:41:35

标签: c# asp.net-mvc

我的实体框架中有2个表:

INATIVOS(员工)
EMPRESAS(公司)

注册员工时,我在@ Html.DropDownListFor(列表)中选择一家公司。

注册正常,公司保存正确。但是,当尝试编辑注册员工时,在“公司”列表中显示错误“无法在实体上设置字段/属性”。

INATIVO.cs

public partial class INATIVOS
{
        public decimal ID { get; set; }
        public string COD_EMPRESA { get; set; }
        public string CHAPA { get; set; }
        public string NOME { get; set; }
        public System.DateTime DATA_NASC { get; set; }
        public string PLANO { get; set; }
        public short LEI { get; set; }
        public short APOSENTADO { get; set; }
        public short ESTADO_VIDA { get; set; }
        public short ISENTO { get; set; }
        public Nullable<System.DateTime> INICIO_VIGENCIA { get; set; }
        public Nullable<System.DateTime> FIM_VIGENCIA { get; set; }
        public string CPF { get; set; }
        public string EMAIL { get; set; }
        public string ENDERECO { get; set; }
        public string NUMERO { get; set; }
        public string COMPLEMENTO { get; set; }
        public string BAIRRO { get; set; }
        public string CIDADE { get; set; }
        public string ESTADO { get; set; }
        public string CEP { get; set; }
        public string TELEFONE { get; set; }
        public string CELULAR { get; set; }
        public string OBSERVACAO { get; set; }

        public List<DEPENDENTES> DEPENDENTES { get; set; }
        public List<EMPRESAS> EMPRESAS { get; set; }
        public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }
}

InativoController.cs

public ActionResult Index(int? id)
{
            INATIVOS inaModel = new INATIVOS();

            using (Entidades db = new Entidades())
            {
                if (id != null)
                {
                    inaModel = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
                }

                inaModel.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
                inaModel.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
            }

            return View(inaModel);
}

1 个答案:

答案 0 :(得分:0)

如果这些是导航属性:

public List<DEPENDENTES> DEPENDENTES { get; set; }
public List<EMPRESAS> EMPRESAS { get; set; }
public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }

然后(1)他们必须是virtual,而(2)他们必须是IListICollection之类的东西:

public virtual ICollection<DEPENDENTES> DEPENDENTES { get; set; }
public virtual ICollection<EMPRESAS> EMPRESAS { get; set; }
public virtual ICollection<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }

不过,顺便说一句,您在这里所做的是很奇怪

inaModel.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
inaModel.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();

基本上,数据库中的内容是,对于给定的员工(INATIVOS),与特定的公司(EMPRESAS)和特定的公司有关系医疗计划(PLANOS_MEDICO)。但是您会忽略这些数据中的任何内容,而将其替换为整个数据库中的所有公司和所有医疗计划

因此,每当您使用此控制器操作来获取现有员工记录时,员工就好像拥有每个公司和每个医疗计划。即使那不是数据库中的内容。我强烈怀疑这不是您想要的。


更新:基于对此答案的评论,听起来好像不是导航属性。它们甚至根本不是模型的属性。它们只是视图填充(可能是)<select>元素所需的数据列表。

如果它们不属于数据模型,则将其从模型中删除。相反,请考虑使用视图模型。例如:

public class InativosViewModel
{
    public INATIVOS Inativos { get; set; }
    public List<EMPRESAS> EMPRESAS { get; set; }
    public List<PLANOS_MEDICO> PLANOS_MEDICO { get; set; }
}

然后在控制器中返回视图模型的实例,该实例是模型和视图所需数据的复合对象:

public ActionResult Index(int? id)
{
    InativosViewModel result = new InativosViewModel();

    using (Entidades db = new Entidades())
    {
        if (id != null)
        {
            result.Inativos = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
        }

        result.EMPRESAS = db.EMPRESAS.ToList<EMPRESAS>();
        result.PLANOS_MEDICO = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
    }

    return View(result);
}

当然,还要更改视图本身中的模型绑定,以现在期望并使用InativosViewModel的实例。如果需要,生成的POST操作仍可以接受INATIVOS的实例,或者也可以接受InativosViewModel的实例。这一切都取决于表单结构是什么以及该操作要发布什么。

或者,如果您想继续使用INATIVOS模型,则仍然可以从其中删除这些列表,但可以使用ViewBag之类的东西将它们发送到视图。像这样:

public ActionResult Index(int? id)
{
    INATIVOS inaModel = new INATIVOS();

    using (Entidades db = new Entidades())
    {
        if (id != null)
        {
            inaModel = db.INATIVOS.Where(x => x.ID == id).FirstOrDefault();
        }

        ViewBag.Empresas = db.EMPRESAS.ToList<EMPRESAS>();
        ViewBag.PlanosMedico = db.PLANOS_MEDICO.ToList<PLANOS_MEDICO>();
    }

    return View(inaModel);
}

然后,在您的视图中,将在此处填充<select>元素:

@Html.DropDownListFor(
    model => Model.COD_EMPRESA,
    new SelectList(ViewBag.Empresas, "CODIGO", "DESCRICAO"),
    htmlAttributes: new { @class = "form-control"
})