您的位置:首页 > 移动开发

Nhibernate 映射 FluentApi Mapping by Code

2015-06-06 16:18 447 查看

Nhibernate 映射 FluentApi Mapping by Code

nHibernate 3.2新增了一种mapping by code的映射策略,很有意思。你可以自定义约定,并且按照约定定制自动映射策略, 面对遗留数据库时这个功能往往很有用,另外,由于mapping by code是基于代码的(而不是xml文件), 对domain object进行重命名的重构操作会非常方便,不用跑到xml映射文件查找字符串了。

代码

//实体类
public class User
{
public virtual long Id { get; set; }

public virtual string Name { get; set; }

public virtual IList<Article> Articles { get; set; }
}

public class UserProfile
{
public virtual long Id { get; set; }

public virtual Gender Gender { get; set; }

public virtual DateTime? Birthday { get; set; }

public virtual string Email { get; set; }
}

public class Article
{
public virtual long Id { get; set; }

public virtual string Content { get; set; }

public virtual User User { get; set; }
}

//ORM映射
public class UserMapping : ClassMapping<User>
{
public UserMapping()
{
//对应的数据库表名
Table("User");
//定义读写属性
Cache(map => map.Usage(CacheUsage.ReadWrite));
//定义主键是自增的
Id(t => t.Id, map => map.Generator(Generators.Native));
//普通属性
Property(t => t.Name);
//定义一对一映射
OneToOne(t => t.UserProfile, map => map.Cascade(Cascade.All));
//映射的文章列表 删除User时会级联删除对应的文章
Bag(t => t.Articles , map => { map.Key(k => k.Column("ArticleId")); map.Inverse(true); map.Cascade(Cascade.Remove); }, rel => rel.OneToMany());
}
}

public UserProfileMapping()
{
Table("UserProfile");
Cache(map => map.Usage(CacheUsage.ReadWrite));
Id(t => t.Id, map => map.Generator(Generators.Foreign<UserProfile>(p => p.User)));
Property(t => t.Birthday);
Property(t => t.Email);
OneToOne(t => t.User, map => map.Constrained(true));
}

public class ArticleMapping : ClassMapping<Article>
{
public ArticleMapping()
{
Table("Article");
Cache(map => map.Usage(CacheUsage.ReadWrite));
Id(t => t.Id, map => map.Generator(Generators.Native));
Property(t => t.Content);
//定义多对一关系 多个Article对应一个User      //对应数据库列名
ManyToOne(t => t.User, map => { map.Column("UserId"); });
}
}


参考过这里,好文啊
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息