如何在 C# 中实现 ORM

Posted

技术标签:

【中文标题】如何在 C# 中实现 ORM【英文标题】:How to implement an ORM in C# 【发布时间】:2015-10-30 18:34:15 【问题描述】:

我正在尝试在 C# 中为 mysql 实现我自己的 ORM,因为我发现它不能完全按照我的意愿去做。

我目前只实现了几个方法(例如保存方法):

public void Save()
    
        string queryVariables = "";
        foreach (PropertyInfo propertyInfo in this.GetType().GetProperties().Where(x => x.Name != "BdClass" && x.GetValue(this) != null))
        
            string isLast = this.GetType().GetProperties().Last() == propertyInfo ? "" : ", ";
            queryVariables += $"propertyInfo.Name = 'MySqlHelper.EscapeString(propertyInfo.GetValue(this).ToString())'isLast";
        
        ConnectionSingleton.Query($"INSERT INTO this.GetType().GetProperties().Single(x => x.Name == "BdClass").GetValue(this) SET queryVariables ON DUPLICATE KEY UPDATE queryVariables;");
    

我正在尝试实现 FindAll() 方法,我希望它返回一个列表,其中包含调用该函数的对象的类型。假设我有一个名为 Person 的类,我想从数据库中获取 Person 表的所有行,我想这样写:

List<Person> persons = Person.FindAll();

我正在努力在 FindAll() 方法中创建对象。

【问题讨论】:

出于好奇,您认为需要自己编写的现有 ORM 的缺点是什么?我确信有一种方法可以弯曲现有的(经过测试的)ORM 库,以通过扩展包含您想要的功能,而不是重新发明***。 我还没有找到任何可以返回我想要类型的对象列表的开源 MySQL ORM。如果你知道一个这样做的(或类似的)我很想听听! 实体框架可以做到:here is a forum post on how to set it up。然后,您只需对 Dbset 使用适当的 Linq 查询,如果您想要查询结果中的列表,您可以调用 .ToList Dapper 可以帮助你。非常快速和轻量级的 ORM。 nuget.org/packages/Dapper.Rainbow.MySql Dapper .net 也可能能够满足您的需求,如果您不想要所有与 EF 相关的开销。 【参考方案1】:

看看Insight Db。我们使用它来处理 Sql Server、Oracle 和 DB2。它也支持 MySQL。我发现它真的很容易使用并且节省了很多时间。

【讨论】:

以上是关于如何在 C# 中实现 ORM的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlite django ORM中实现have子句

如何在LibGDX中实现Sugar ORM

如何在 C# 中实现 sdbm 哈希函数?

如何在 C# 中实现 Base64 URL 安全编码?

如何在 C# 中实现单例设计模式? [复制]

如何在c#中实现决策矩阵