实体框架:无法将找到的对象分配给我的属性

时间:2018-07-01 17:16:15

标签: entity-framework

我正在创建Expediente,我可以毫无问题地获取所有数据,例如Funcionario。 当我尝试将其指定为

ex.Funcionario = funcionario as Funcionario;

让我为空 但是如果我尝试像

ex.Funcionario= db.Funcionario.Where(F => F.Email == vm.idFuncionario).Include(F => F.Grupo);

我得到一个“不能转换隐式类型”。错误。 关于如何在不丢失数据的情况下将Funcionario分配给Expediente上的属性的任何想法?

public ActionResult Create(ExpedienteCrearViewModel vm)
        {

            if (ModelState.IsValid)
            {
                Expediente ex = new Expediente();

                var funcionario = db.Funcionario.Where(F => F.Email == vm.idFuncionario).Include(F => F.Grupo);
                ex.Funcionario = funcionario as Funcionario;

                ex.Tramite = db.Tramite.Find(vm.idTramite);

                ex.Solicitante = (Solicitante)Session["solicitante"];
                ex.abierto = true;
                ex.FechaCreacion = DateTime.Now;
                db.Expediente.Add(ex);
                db.SaveChanges();
                vm.Trsmites = new SelectList(db.Tramite.ToList(), "Codigo", "Titulo");
                vm.Funcionarios = new SelectList(db.Funcionario.ToList(), "Email", "Nombre");
            }

            return View(vm);
        }

这是Expediente类

public class Expediente
    {
        //Para que sea key y no genere identity la BD 
        [Key]
        public int Codigo { get; set; }

        [Required]
        public Tramite Tramite { get; set; }

        //no le pongo requiered para que no de error al crearlo sin esto
        public DateTime FechaCreacion { get; set; }

        //por defecto hay que ponerlo en true
        public Boolean abierto { get; set; }

        [Required]
        public Funcionario Funcionario { get; set; }

        [Required]
        public Solicitante Solicitante { get; set; }

        public virtual ICollection<EtapaCumplida> etapasCumplidas { get; set; }

    }

1 个答案:

答案 0 :(得分:0)

以下变量funcionario的定义如下:

var funcionario = db.Funcionario.Where(F => F.Email == vm.idFuncionario).Include(F => F.Grupo);

返回一个IQueryable<Funcionario>,该行不能像您在下一行中那样隐式或显式转换:

ex.Funcionario = funcionario as Funcionario;

您应该首先执行查询,以便它返回Funcionario的一个实例,因此只需使用以下内容:

var funcionario = db.Funcionario
                    .Where(F => F.Email == vm.idFuncionario).Include(F => F.Grupo)
                    .SingleOrDefault();
ex.Funcionario = funcionario;

SingleOrDefault()执行查询并返回Funcionario的一个实例。 我的代码伪装成“功能性”在每个电子邮件中都是唯一的。如果您认为同一封电子邮件必须有更多的“功能范围”,那么只需将SingleOrDefault()替换为FirstOrDefault()

侧面注意:您可以将条件直接传递给SingleOrDefault()方法,如下所示:

var funcionario = db.Funcionario
                    .Include(F => F.Grupo)
                    .SingleOrDefault(F => F.Email == vm.idFuncionario);
ex.Funcionario = funcionario;