mvc 5中的模型绑定问题

时间:2015-03-18 19:16:03

标签: asp.net-mvc

我在使用代码优先执行创建操作时遇到了一些问题。

我有这些课程。

[Table("Localidades")]
public class Localidad
{
    public Localidad() { 
    }

    public int LocalidadId { get; set; }

    [Required]
    [StringLength(150)]
    [Display(Name = "Nombre")]
    public string nombre { get; set; }

    public Provincia ProvinciaId { set; get; }
}

[Table("Provincias")]
public class Provincia
{
    public Provincia() { 
    }

    public int ProvinciaId { set; get; }

    [StringLength(150)]
    [Display(Name = "Nombre")]
    public string nombre { set; get; }
}

[Table("Domicilios")]
public class Domicilio
{
    public Domicilio() { 
    }

    public int DomicilioId { get; set; }

    [StringLength(150)]
    [Display(Name = "Calle")]
    public string calle { get; set; }

    [Display(Name = "Número")]
    public int numero { get; set; }

    [Display(Name = "Piso")]
    public int piso { get; set; }

    [Display(Name = "Departamento")]
    public char dpto { get; set; }

    [Display(Name = "Código Postal")]
    public int codigoPostal { get; set; }

    [Display(Name = "Localidad")]
    public Localidad LocalidadId { get; set; }
}

[Table("Personas")]
public  abstract class Persona
{
    public Persona() { 
    }

    [Key]
    public int ID { set; get; }

    public Domicilio DomicilioId { set; get; }

    [Required]
    [StringLength(150)]
    public string nombre { set; get; }

    [Required]
    [StringLength(40)]
    public string nroDocumento {get;set;}

    [Required]
    [StringLength(150)]
    public string apellido  {get;set;}

    public DateTime? fechaNacimiento {get;set;}

    public long telefonoFijo {get;set;}

    public long telefonoMovil {get;set;}

    [EmailAddress]
    public string email {get;set;}

    [Display(Name = "Sexo")]
    public char sexo {get;set;}

    [DataType(DataType.Date)]
    public DateTime? fechaAlta {get;set;}

    [DataType(DataType.Date)]
    public DateTime? fechaBaja { get;set;}
}

Localidad有一个FK到Provincia,Domicilio有一个FK到Localdiad和Persona有一个FK到Localidades。到目前为止,数据库架构是正确的。

当我尝试创建新人时,我的代码如下: (我从正在运行的ddl获取了id)

var localidad = db.Localidades.Find(model.LocalidadId);
var domicilio = new Domicilio { calle = "estrada", dpto = 'a', LocalidadId = localidad };
var user = new ApplicationUser { UserName = model.nroDocumento.ToString(), Email = model.Email };
var paciente = new Paciente
{
    nombre = model.Nombre,
    apellido = model.Apellido,
    fechaAlta = DateTime.Now,
    nroDocumento = model.nroDocumento,
    DomicilioId = domicilio
};

使用我从模型中获取的id(它是所选Localidad的正确ID),我从数据库中检索Localidad并将其分配给domicilio模型。

问题在于,它不是将模型链接到数据库中的相应Localidad(使用FK),而是在数据库中创建一个新的寄存器。

我知道这是对代码优先工作方式的一种误解,所以如果有人能指出我正确的方向,我会非常感激。

1 个答案:

答案 0 :(得分:2)

好的,首先在Entity Framework中,您将使用导航属性而不是外键。出于性能和效率的目的,每个导航属性都应该延迟加载,因为您不希望EF在实际需要之前加载每个导航属性。您可以通过添加关键字“virtual”来实现。在你的Localidad:

public virtual Provincia Provincia { set; get; }

最好使用对象名称,因为此属性实际上指向Provincia对象的实例而不是ID。

在我假设Provincia - localida关系的一对多关系中,你还需要在一端包含一个集合。

在您的Provincia模型中:

public Provincia()
{
     this.Localidads = new HashSet<Localidad>();
}
public virtual ICollection<Localidad> Localidads { get; set; }

这里我们还添加了一个构造函数来初始化Localidads集合

现在我们已经建立了正确的一对多关系,请使用迁移更新数据库。

至于为例子添加一个对象(Localidad)的方法,你就是那个部分:创建一个对象(Localidad)变量,填充它的标量属性(非导航)。

要添加导航属性,您可以在上下文中找到它或使用where方法搜索它:

Localidad.Provincia = db.Find(yourprovinciaID);

假设你手头有这个ID。如果不这样做,您可以使用任何标量属性进行搜索:

Localidad.Provincia = db.Provincias.Where(x=> x.attribute == attributevalue ).FirstOrDefault<Provincia>();

一旦我们的对象实例(此例子中的Localidad)填充了它的值, 我们现在可以将它添加到上下文中并将其保存到数据库中。

context.Localidads.Add(Localidad);
context.SaveChanges();

localidad将自动添加到相应省份的集合中,实体框架将为您处理外国关键事务。

我刚才解释的基本上是如何使一对多的关系发挥作用。如果您想使用多对多或一对一的关系,我建议您查找Fluent API文档:msdn.microsoft.com/en-US/data/jj591620

如果您不清楚并愿意回答您的问题,我很抱歉。