有没有一种方法可以根据C#对象的属性自动形成长的MySql INSERT命令?

时间:2019-07-01 21:33:54

标签: c# mysql

我正在转换一个使用MongoDB数据库的程序来使用MySQL数据库。该数据库存储有关产品的信息,每个产品由具有大约五十个属性的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***]
}

如您所见,添加五十个参数将意味着很长的语句,如果我省略一个参数或错误键入参数名称之一,则很容易出错。这比MongoDb方法要方便得多。

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

1 个答案:

答案 0 :(得分:0)

您正在寻找的声音听起来像是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; }
}

然后,对于任何一对一地排列的属性,只需将其映射并称为好即可。但是对于Entity Framework无法推断的类型,您需要修复AutoMapper定义:

这看起来像:

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

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

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

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

这只是一个例子。 Dapper是另一个选择,但您也要舍弃一些细微之处以提高性能。