我的实体框架中有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);
}
答案 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)他们必须是IList
或ICollection
之类的东西:
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"
})