我在使用代码优先执行创建操作时遇到了一些问题。
我有这些课程。
[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),而是在数据库中创建一个新的寄存器。
我知道这是对代码优先工作方式的一种误解,所以如果有人能指出我正确的方向,我会非常感激。
答案 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。
如果您不清楚并愿意回答您的问题,我很抱歉。