实体框架 - 代码优先4.1 - ASP.NET MVC3

时间:2011-04-05 14:20:57

标签: entity-framework asp.net-mvc-3

我在MVC3中编程,我有以下模型:

 public class L_CabecRegistoPedido
    {
        [Key]
        public int Id { get; set; }
        public int Numero { get; set; }
        public int Ano { get; set; }
        public int Utilizador { get; set; }
        public String Cliente { get; set; }
        public String NomeEmpresa { get; set; }
        public String MarcaEmpresa { get; set; }
        public int? Marca { get; set; }
        public String Projecto { get; set; }
        public String Responsavel { get; set; }
        public String EmailResp { get; set; }
        public String TelefoneResp { get; set; }
        public String DepartamentoEmpresa { get; set; }
        public int? Departamento { get; set; }
        public DateTime DataRegisto { get; set; }
        public int? EstadoPedido { get; set; }
        public int? FasePedido { get; set; }
        public DateTime DataEntregaRequisitada { get; set; }
        public DateTime DataEntrega { get; set; }
        public String Observacoes { get; set; }
        public bool Transformacao { get; set; }
        public int Versao { get; set; }
        public List<L_LinhaRegistoPedido> Linhas { get; set; }

    }

    public class L_LinhaRegistoPedido
    {
        [Key]
        public int Id { get; set; }
        public int? IdCabec { get; set; } /* **Foreign Key to L_CabecRegistoPedido ** */
        public int Utilizador { get; set; }
        public String Artigo { get; set; }
        public String CabDescricao { get; set; }
        public String Descricao { get; set; } /* TODO: espaço neste campo*/
        public Double Quantidade { get; set; }
        public DateTime DataRegisto { get; set; }
        public DateTime DataEntregaRequisitada { get; set; }
        public DateTime DataEntrega { get; set; }
        public int? EstadoLinhasPedido { get; set; }
        public int? FaseLinhasPedido { get; set; }
        public String Observacoes { get; set; }
        public bool Transformacao { get; set; }
        public L_CabecRegistoPedido CabecRegisto { get; set; }
        public List<L_SubLinhaRegistoPedido> SubLinhas { get; set; }

    }

然后我正在使用这样的DBContext:

 public class AppADO : DbContext
    {

        public AppADO(String ConnectionStringName)
            : base(ConnectionStringName) { }

        public DbSet<L_CabecRegistoPedido> L_CabecRegistoPedido { get; set; }
     }

当我创建SaveChanges()时我在控制器上有这个代码:

 [HttpPost]
        public ActionResult Create(FormCollection formCollection)
        {

            L_LinhaRegistoPedido linhaRegisto = new L_LinhaRegistoPedido();
            try
            {
                if (ModelState.IsValid)
                {
                    if (String.IsNullOrEmpty(formCollection["IDArtigo"])) linhaRegisto.Artigo = null; else linhaRegisto.Artigo = formCollection["IDArtigo"];

                    linhaRegisto.IdCabec =   int.Parse(formCollection["IDRegistoPedido"]);
                    linhaRegisto.Quantidade = Double.Parse(formCollection["IDQuantidade"]);
                    linhaRegisto.CabDescricao = formCollection["IDCabDescricao"];
                    linhaRegisto.Descricao = formCollection["IDDescricao"];
                    linhaRegisto.DataRegisto = DateTime.Parse(formCollection["IDDataRegisto"]);
                    linhaRegisto.DataEntrega = DateTime.Parse(formCollection["IDDataEntrega"]);
                    linhaRegisto.DataEntregaRequisitada = DateTime.Parse(formCollection["IDDataEntregaRequisitada"]);

                    if (string.IsNullOrEmpty(formCollection["IDEstadoLinha"])) linhaRegisto.EstadoLinhasPedido = null; else linhaRegisto.EstadoLinhasPedido = int.Parse(formCollection["IDEstadoLinha"]);
                    if (string.IsNullOrEmpty(formCollection["IDFaseLinha"])) linhaRegisto.FaseLinhasPedido = null; else linhaRegisto.FaseLinhasPedido = int.Parse(formCollection["IDFaseLinha"]);

                    linhaRegisto.Observacoes = formCollection["IDObservacoes"];

                    appAdo.L_LinhaRegistoPedido.Add(linhaRegisto);
                    appAdo.SaveChanges();
                }

                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex);
                return View(linhaRegisto);
            }
        }

但我收到错误:

“无效的列名称'CabecRegisto_Id'。”

此列由Entity Framework生成,我不知道如何将L_LinhaRegistoPedido(IdCabec)的外键与L_CabecRegisto关联,以便实体框架找到外来的并且不会自动生成..

1 个答案:

答案 0 :(得分:1)

尝试使用ForeignKeyAttribute明确标记列,例如:

public class L_LinhaRegistoPedido
{
    [Key]
    public int Id { get; set; }

    /* **Foreign Key to L_CabecRegistoPedido ** */
    [ForeignKey("CabecRegisto")] 
    public int? IdCabec { get; set; } 
    public L_CabecRegistoPedido CabecRegisto { get; set; }       

    // All other properties omitted 
}

ForeignKeyAttribute的构造函数中,我放置了属性CabecRegistro的名称,我假设它是IdCabec的导航属性。您可能希望CabecRegistro virtual启用Layzy加载。

public virtual L_CabecRegistoPedido CabecRegisto { get; set; }

顺便说一句,如果你完全删除IdCabec,EF应该负责在数据库本身中创建外键关系。在这种情况下,你可以放松对命名的控制。