随笔 - 44,  文章 - 2,  评论 - 22,  阅读 - 95728

大部分转自: http://landyer.com/archives/138

PetaPoco C#微型ORM框架,基本无需配置,仅由单个cs文件构成,支持.net3.5 .net4.0。

截稿时PetaPoco的官方最新版本为5.0.1。我不采用5.0.1版本,因为我用的是.net3.5,而5.0.1的版本中用到了一个类System.Tuple,这个类是从.net4.0才开始有的。(当然也可以自己实现这个类,不过像我这样的初学者还是算了吧)。

NuGet图形界面中默认列出的只有最新版本,一装就是5.0.1, 那就是使用NuGet命令行。

1.依次打开《工具》《库程序包管理器》《程序包管理器控制台》

2.敲入命令对可用的版本进行查询get-package –listavailable –allversion –filter petapoco,如图

3.敲入命令进行安装install-package petapoco –version 4.0.3

 

配置PetaPoco

现在又遇到一个问题,使用Ctrl+Shift+B编译项目的时候报错,说dynamic神马的不存在。

这是因为Dynamic也是.net4.0的。PetaPoco官方提供了一个编译时的选项来开启&关闭对dynamic的支持。

下面来进行编译选项的设置:

  1. 在项目上《右键》《属性》
  2. 选择左侧tab的第二项《生成》,在《条件编译符号》中输入PETAPOCO_NO_DYNAMIC
  3. 保存,再次Ctrl+Shift+B,进行编译。这次就OK了。

 

配置PetaPoco T4模板

  1. 打开Database.tt文件

    ConnectionStringName = "WorkDemo";            // Uses last connection string in config if not specified
    Namespace = "WorkDemo.Tests.Models";
    RepoName = "PPUtils";            //辅助类的名字

 

PetaPoco使用示例

    一对多 和 多对一

  • 为Account增加一个额外的属性AccountUsers

  • 为Account_User增加一个额外的属性Account
  • 将Account和Account_User进行关联
复制代码
    public partial class Account
    {
        [PetaPoco.Ignore]
        public List<Account_User> AccountUsers { get; set; } 
    }
    public partial class Account_User
    {
        [PetaPoco.Ignore]
        public Account Account { get; set; }
    }

    //
    public class UserAccountRelator
    {
        private Dictionary<long, Account> accounts = new Dictionary<long, Account>();

        public Account_User MapIt(Account account, Account_User user)
        {
            Account accountExisting;
            if (accounts.TryGetValue(account.Id, out accountExisting))
            {
                account = accountExisting;
            }
            else
                accounts.Add(account.Id, account);

            user.Account = account;
            return user;
        }
    }

    //
    public class AccountUserRelator
    {
        public Account current;

        public Account MapIt(Account account, Account_User user)
        {
            if (account == null)
                return current;

            if (current != null && current.Id == account.Id)
            {
                current.AccountUsers.Add(user);
                return null;
            }

            var prev = current;

            current = account;
            current.AccountUsers = new List<Account_User>();
            current.AccountUsers.Add(user);

            return prev;
        }
    }
复制代码

    查询:

复制代码
            var users = db.Fetch<Account, Account_User, Account_User>(
                new UserAccountRelator().MapIt,
                "select * from Account A left join Account_User AU on AU.AccountId=A.Id "
                );
            foreach (Account_User user in users)
            {
                Console.WriteLine("{0} - {1}", user.Id, user.UserName);
            }

            var accounts = db.Fetch<Account, Account_User, Account>(
                new AccountUserRelator().MapIt,
                "select * from Account A left join Account_User AU on AU.AccountId=A.Id "
                );
            foreach (Account acc in accounts)
            {
                Console.WriteLine("{0} - {1}", acc.Id, acc.Name);
            }
复制代码

 

posted on   dfg727  阅读(2514)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示