[原创]Fluent NHibernate之旅(四)-- 关系(下)

简介: 最近一直忙着准备去旅行的东东,所以进度慢下来了,明天就要出发了,嘿嘿,在出发前,把多对多给写完吧。如果你第一次看这个系列,可以先看看先前几篇,了解下。 一、开篇:ISessionFactory Configuration 二、实体映射:Entity Mapping 三、继承映射:Inher...

最近一直忙着准备去旅行的东东,所以进度慢下来了,明天就要出发了,嘿嘿,在出发前,把多对多给写完吧。如果你第一次看这个系列,可以先看看先前几篇,了解下。

一、开篇:ISessionFactory Configuration

二、实体映射:Entity Mapping

三、继承映射:Inheritence Mapping

四、一对一映射:One-to-One Mapping

五、一对多映射:One-to-Many Mapping

场景和数据库设计

前两篇我们介绍了“一对一”和“一对多(多对一)”,或许前两种用的比较多,但多对多的关系,有时候我们也会遇到,比如我们一直演示的电子商务站,我们的订单和产品的关系,就是一个非常典型的“多对多”。看看我们的数据库设计:

image

这里说一下,订单对于产品来说,不一定需要知道,也或者可以不需要一起加载,所以可以用延迟加载或者不加载,而产品对于订单来说,应该是需要立即加载,从而知道订单中所有的商品。随着扩展,我们必须给我们的Product和Order加入相关的属性:

public abstract class Product
{
    public virtual int ProductID { get; set; }

    private ISet<Order> m_orders = null;
    public ISet<Order> Orders
    {
        get
        {
            if (this.m_orders == null)
            {
                this.m_orders = new HashedSet<Order>();
            }
            return this.m_orders;
        }
        set
        {
            this.m_orders = value;
        }
    }

    //product other Property
}

public class Order
{
    public Order()
    {
        this.Products = new HashedSet<Product>();
    }

    public virtual int OrderID { get; set; }

    public ISet<Product> Products { get; set; }

    //order other Property
}

映射

如果大家先前几篇都看过的话,我觉得应该没有任何问题了,因为Fluent NHibernate 真的很简单,很流畅,代码如下:

public class ProductMap : ClassMap<Product>
{
    public ProductMap()
    {
        Id(p => p.ProductID);
        HasManyToMany<Order>(p => p.Orders)
            .AsSet()
            .LazyLoad()
            .ParentKeyColumn("ProductID")
            .ChildKeyColumn("OrderID")
            .Table("OrderProduct");

        Map(p => p.CreateTime);
        Map(p => p.Name);
        Map(p => p.Price);
    }
}

public class OrderMap : ClassMap<Order>
{
    public OrderMap()
    {
        Id(o => o.OrderID).GeneratedBy.Identity();
        HasManyToMany<Product>(o => o.Products)
            .AsSet()
            .Not.LazyLoad()
            .Cascade.All()
            .ParentKeyColumn("OrderID")
            .ChildKeyColumn("ProductID")
            .Table("OrderProduct");

        Map(o => o.Price);
        Map(o => o.State).CustomType<OrderState>();
        Map(o => o.Address);
        Map(o => o.Coignee);
        Map(o => o.CreateTime);
        Map(o => o.Zip);
        References<User>(o => o.User).Not.LazyLoad().Column("UserID");
    }
}

这里我们用了一个单独的一个表来保存这个多对多关系,所以需要Table("Table Name")。

ParentKeyColumn和ChildKeyColumn都是相对于自己的,大家也可以生成hbm来看下多对多的传统的写法。

测试

映射完成了,我们测试一下,我们还是使用xunit来单元测:

[Fact]
public void CreateOrder()
{
    using(var session = this.SessionFactory.OpenSession())
    {
        session.Transaction.Begin();
        var products = session.CreateCriteria<Product>().List<Product>();
        var user = session.Load<User>(1);
        var order = new Order
        {
            User = user,
            Address = "Shang Hai",
            Coignee = "Candy",
            State = OrderState.Created,
            CreateTime = DateTime.Now,
            Zip = "200336"
        };

        order.Products.AddAll(products);
        order.Price = order.Products.Sum(p => p.Price);

        session.Save(order);
        session.Transaction.Commit();
    }
}

(测试代码不是很完全,在文章结尾会有源代码,大家可以下载进行学习。)

ok,我们来看下我们的测试结果,我们需要:绿

image

哈哈,好多Sql语句,不错不错。

总结

拖了那么久,也算把关系给说完了,后面还有一些文章,要等旅游回来了,吼吼。

不过现在基本上,我们可以构建一般的BS项目了,没想到写着写着,就构建了一个初级的电子商务网站,嘿嘿。

下载地址:点此下载源代码

 

PS:给我一盏阿拉丁神油吧,让我消除风暴。。。。。

PS2:貌似不是很多人喜欢,或许文笔不太好,继续锻炼中。如果有不好的,大家可以联系我。

相关文章
|
2天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
6天前
|
人工智能 中间件 API
AutoGen for .NET - 架构学习指南
《AutoGen for .NET 架构学习指南》系统解析微软多智能体框架,涵盖新旧双架构、核心设计、技术栈与实战路径,助你从入门到精通,构建分布式AI协同系统。
305 142
|
2天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
404 0
|
3天前
|
传感器 人工智能 算法
数字孪生智慧水务系统,三维立体平台,沃思智能
智慧水务系统融合物联网、数字孪生与AI技术,实现供水全流程智能监测、预测性维护与动态优化。通过实时数据采集与三维建模,提升漏损控制、节能降耗与应急响应能力,推动水务管理从经验驱动迈向数据驱动,助力城市水资源精细化、可持续化管理。
267 142
|
2天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
204 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
17天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
2天前
|
机器学习/深度学习 人工智能 运维
智能照明稳压节能控制器,路灯节能稳压系统,沃思智能
智能照明调控柜集电力分配、远程控制与能耗管理于一体,支持自动调光、场景切换与云平台运维,广泛应用于市政、商业及工业领域,显著节能降耗,助力智慧城市建设。
184 137
kde
|
2天前
|
人工智能 关系型数据库 PostgreSQL
n8n Docker 部署手册
n8n是一款开源工作流自动化平台,支持低代码与可编程模式,集成400+服务节点,原生支持AI与API连接,可自托管部署,助力团队构建安全高效的自动化流程。
kde
263 3

热门文章

最新文章