首页 > 解决方案 > 有没有办法根据 C# 对象的属性自动形成长的 MySql INSERT 命令?

问题描述

我正在将使用 MongoDB 数据库的程序转换为使用 MySQL 数据库。该数据库存储有关产品的信息,每个产品在代码中由具有大约 50 个属性的 C# 对象表示。将产品对象保存到 MongoDb 只需一行简短的代码即可完成。但是,要保存到 MySql,我必须创建一个很长的命令,该命令很容易包含错误。我想知道是否有办法创建一个 MySqlCommand 来插入/更新一个自动从 C# 对象获取参数的对象。

要将产品插入 MongoDB,我使用以下代码(为清楚起见进行了简化):

void SaveProduct( Product p )
{
    IMongoCollection<Product> collection = Db.GetCollection<Product>("products");
    collection.InsertOne(p);
}

对象序列化到数据库的确切方式可以通过向对象的属性添加属性来控制。

要将产品插入 MySql,我使用以下代码:

using (MySqlCommand insertCommand = connection.CreateCommand())
{
    insertCommand.CommandText = "INSERT INTO products("sku, description, categoryid, subcategoryid, [***LOTS MORE VALUE NAMES***] " VALUES (?sku, ?description, ?categoryid, ?subcategoryid), [***LOTS MORE VALUE NAMES***]";
    insertCommand.Parameters.AddWithValue("?sku", sku);
    insertCommand.Parameters.AddWithValue("?description", description);
    insertCommand.Parameters.AddWithValue("?categoryid", categoryid);
    insertCommand.Parameters.AddWithValue("?subcategoryid", subcategoryid);
    [***LOTS MORE PARAMETERS***]
}

如您所见,添加 50 个参数将意味着一个非常长的语句,如果我省略一个参数或错误输入其中一个参数名称,这很容易出错。这远不如 MongoDb 方法方便。

我希望的是通过读取对象的属性、推断数据库表列名称和添加参数来形成 MySqlCommands 的东西。同样,在读取数据库时,我想从查询返回的行中自动填充对象的属性。

标签: c#mysql

解决方案


您正在寻找的东西听起来像 ORM,并且可能更像是 Mapper。

一种有据可查的方法是实体框架和 AutoMapper。

假设您有如下视图或业务模型:

public class Item
{
    public string Sku { get; set; }
    public int Id { get; set; }
    public string Name { get; set; }
}

和一个像这样的实体:

public partial class Part
{
    public string Sky { get; set; }
    public int PartId { get; set; }
    public string Name { get; set; }
}

然后你会为任何一对一排列的属性,只需映射并称之为好。但是对于实体框架无法推断出您需要修复 AutoMapper 定义的类型:

这看起来像:

var mapper = config.CreateMapper<Item, Part>();
mapper.ForMember(dest => dest.PartId, opt => opt.MapFrom(src => src.Id));

然后你的实际插入命令或多或少看起来像:

 dc.Add(Mapper.Map(srcItem));

更多的设置工作,但非常值得。您也不会拥有可以更改的参数名称,并且代码编译时不会出现任何警告/错误。

这只是一个例子。Dapper 是另一种选择,但你也放弃了一些细节来获得性能。


推荐阅读