将模型中的复杂对象绑定到数据库

时间:2012-12-04 21:15:59

标签: asp.net-mvc asp.net-mvc-3 model-view-controller model

我今天下午看了很多文章,但我似乎无法找到一篇完整的文章来处理模型中的复杂对象,以解决我正在尝试做的事情。

我正在使用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");
    }
  }
}

1 个答案:

答案 0 :(得分:1)

使用属性Address装饰Coordinates[ComplexType]。在dbcontext子类中重写OnModelCreating并将复杂属性映射到适当的列。

默认情况下,复杂对象将像Address_AddressCoordinates_Latitude一样进行映射,因此您需要使用

等覆盖默认映射
modelBuilder
          .Entity<Person>()
          .Property(x => x.Address.Address1)
          .HasColumnName("Address1");