EF4.1之复杂类型

首先我们生成两张对应表:

    public class Client
    {
        public int ClientID { set; get; }
        public string ClientName { set; get; }

        //此时 这个 Address 并不想要在数据库里面 生成对应的 数据表, 比如我们要丰富 业务逻辑,想要设置必填项,
        //想要 把这个 复杂的属性  映射到 表中的字段
        //要想要 生成到 Client 对应的 字段 使用 标注就不能实现了,,所以这时 要在 构建器里面进行设置
        public Address ResidentialAddress { set; get; }
        public Address DeliveryAddress { set; get; }
    }

    public class Address
    {
        public int StreetNumber { set; get; }
        public string StreetName { set; get; }
    }

我定义了两个类,但是我并不想生成两张表,而是下面那样的生成一张表:

我们可以看出,我们这样做而没有是将所有的属性都定义到一张表里面,这样是可以丰富我们的模型。但是这个时候想要通过标注来限制我的模型是不行的,设个时候就要用到模型构建器了。

 1             modelBuilder.Entity<Client>().Property(c => c.ClientID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
 2             modelBuilder.Entity<Client>().Property(c => c.ClientName).IsRequired().HasMaxLength(32);
 3 
 4             //下面是重点 首先,将 Address设置为 复杂属性  然后 将 Address 里面的属性对应  生成到 Client 数据表的字段
 5             modelBuilder.ComplexType<Address>();//将 类 Address 设置成 复杂属性
 6             //这个复杂属性 也可以  用标注的 方式 加在类的 上面[ComplexType],,但是下面的生成 到数据库表的 字段
 7 
 8 
 9 
10             modelBuilder.Entity<Client>().Property(c => c.ResidentialAddress.StreetName).HasColumnName("ResAddressStreetName").IsRequired().HasMaxLength(325);
11             modelBuilder.Entity<Client>().Property(c => c.ResidentialAddress.StreetNumber).HasColumnName("ResAddressStreetNum").IsRequired();
12             modelBuilder.Entity<Client>().Property(c => c.DeliveryAddress.StreetName).HasColumnName("DelAddressStreetName").IsRequired().HasMaxLength(325);
13             modelBuilder.Entity<Client>().Property(c => c.DeliveryAddress.StreetNumber).HasColumnName("DelAddressStreetNum").IsRequired();

 

但是使用复杂模型一定要注意一点:

就是复杂类型就是为null ,就不行不对其进行赋值,就是赋值一个所有属性都为null的对象也是要进行赋值的。同样的道理:EF获得实体模型的时候即使是获得实体的所有的属性都为null,也是会返回一个实体。

 

posted @ 2013-11-13 20:03  小小gogo  Views(342)  Comments(0)    收藏  举报