我今天下午看了很多文章,但我似乎无法找到一篇完整的文章来处理模型中的复杂对象,以解决我正在尝试做的事情。
我正在使用Code First方法,但没有我的模型直接改变我的数据库结构。因此,如果数据库结构发生更改,我手动更改模型。
话虽如此,我有下表:
Name
Address1
Address2
Address3
City
State
Zip
Latitude
Longitude
我想构建一个如下所示的模型:
public class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Coordinates Coordinates { get; set; }
}
public class Address {
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class Coordinates
{
public float Latitude { get; set; }
public float Longitude { get; set; }
}
在我的脑海中,对于从数据库返回的一对一数据,这似乎是一种整洁的,有针对性的方法。而不是所有这些单独的变量,类似的数据被分组为子类。
我的问题是:如何使用EF将此复杂模型绑定到我的数据库?如果那是不可能的,我如何编写自定义绑定器以这种方式处理数据。
或者我错误地想到了这一点。有没有不同的方法来处理这个问题,还是应该以不同的方式构建数据?
修改
根据Jason Meckley在下面的回答,这是我用来完成此任务的最终代码。
namespace MyNamespace
{
public partial class Person
{
public string Name { get; set; }
public Address Address { get; set; }
public Coordinates Coordinates { get; set; }
}
[ComplexType]
public class Address
{
[Display(Name = "Address")]
public string Address1 { get; set; }
public string Address2 { get; set; }
public string Address3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
[ComplexType]
public class Coordinates
{
public float Latitude { get; set; }
public float Longitude { get; set; }
}
public partial class DATABASE_CONNECTION_NAME : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder
.Entity<Person>()
.Property(x => x.Address.Address1)
.HasColumnName("Address1");
modelBuilder
.Entity<Person>()
.Property(x => x.Address.Address2)
.HasColumnName("Address2");
modelBuilder
.Entity<Person>()
.Property(x => x.Address.Address3)
.HasColumnName("Address3");
modelBuilder
.Entity<Person>()
.Property(x => x.Address.City)
.HasColumnName("City");
modelBuilder
.Entity<Person>()
.Property(x => x.Address.State)
.HasColumnName("State");
modelBuilder
.Entity<Person>()
.Property(x => x.Address.Zip)
.HasColumnName("Zip");
modelBuilder
.Entity<Person>()
.Property(x => x.Coordinates.Latitude)
.HasColumnName("Latitude");
modelBuilder
.Entity<Person>()
.Property(x => x.Coordinates.Longitude)
.HasColumnName("Longitude");
}
}
}
答案 0 :(得分:1)
使用属性Address
装饰Coordinates
和[ComplexType]
。在dbcontext子类中重写OnModelCreating
并将复杂属性映射到适当的列。
默认情况下,复杂对象将像Address_Address
和Coordinates_Latitude
一样进行映射,因此您需要使用
modelBuilder
.Entity<Person>()
.Property(x => x.Address.Address1)
.HasColumnName("Address1");