有时候我们希望在sql一个表里面的column, 一部分被分化成另一个class
典型的例子是 Address
直接看代码:
[Table("member")]public classMember
{
[Key]public Int32 memberId { get; set; }public string name { get; set; }public virtual Address address { get; set; }
}/*不能公开 - public DbSet
addresss { get; set; }public classAddress
{/*这里一定要写 column 即使名字一样,因为defaul的命名法是 Address_postcode*/[Column("postcode")]public string postcode { get; set; }
[Column("country")]public string country { get; set; }
}
insert
db.members.Add(newMember
{
name= "lu xiao feng",
address= newAddress
{
country= "MALAYSIA",
postcode= "81300"}
});
db.SaveChanges();
注 : 复杂类型内不要放 FK concurrentCheck 那些比较好(我没研究,但是常遇到bug)
更新 :
默认情况下,我们不使用[Column("xx")]也是可以的,EF 会替我们命名,规范是 属性名 + "_" + 属性名 + "_" + .... 都是用属性名,配合下划线,多少层都可以。
当某个entity有超过1个同类的 ComplexType 时,上面的 [Column("xx")] 就搞不定了
这时我们可以用 :
var nat = modelBuilder.Types();
nat.Configure(n=> n.Property(p => p.ta1.token).HasColumnName("ta1_token"));
nat.Configure(n=> n.Property(p => p.ta2.token).HasColumnName("ta2_token"));
complex 不可以是null , 你至少也要它一个空的对象。不然会 saveChange error的, EF 以后可能会支持。
更新 : 2016-09-03
突发奇想,以为可以这样设定名字(本来是 address_text, 我希望变成 adminAddress_text), 很可惜不可以这样 /.\
[Column("adminAddress")]public Address address { get; set; }