首先我们生成两张对应表:
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,也是会返回一个实体。