根据场景插入应映射到不同数据库 table 的对象

Inserting object that should be mapped into different DB table depending on scenario

我有一个对象,其属性名称准确地命名了数据库中的字段名称table,但我不确定如何插入它。 唯一不同的是 DB table 名称。所以它是一个名称不同 model/mapped table 的对象,但我希望将它插入到名称与模型不同的 table 中。 我试过这个:

var val = info.FooBarObj;
conn.Execute("insert DBInformation(val) values(@val)", new { val = val }); 

例如

对象是 FooBarObj,属性是 int Id, string Foo, string Bar

并且 DBInformation 具有字段名称:Id, Foo, and Bar 但 table 不称为 FooBarObj,而是称为 DBInformation

如何插入这样的内容?我正在使用 Dapper

编辑:

我可以为 FooBar 模型设置两个 table 属性吗?

例如[Table("DBInformation")][Table("FooBar")].

我有一个奇怪的边缘情况,如果发生这种情况,我想插入到 FooBar 中,如果发生另一种情况,则插入到 DBInformation 中。这就是我目前面临的问题,因此这就是为什么我不能只添加属性并解决这个问题的原因。

查看 Dapper.Contrib 项目。它允许您用一些有用的属性装饰您的模型 classes。

使用 FooBar class 上的 Table 属性来确定这应该映射到 DBInformation table。例如:

[Table("DBInformation")]
public class FooBar
{
    #region Properties

    [ExplicitKey] // Use this attribute if your ID field is not automatically generated, (identity)
    public int Id { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

使用 Dapper.Contrib 的另一个好处是它可以让您非常轻松地执行 CRUD 操作。例如,对于插入:

using (var conn = new SqlConnection(connectionString))
{
     conn.Insert(myFooBar);
}

以及更新:

using (var conn = new SqlConnection(connectionString))
{
     conn.Update<FooBar>(myFooBar);
}

等等

编辑

为了解决您的 "real" 问题(您对原始版本的最新编辑),您可能需要根据特定情况插入两个 tables,然后我会去回到只调整你提供的 SQL dapper:

string theTable = someCondition : "DBInformation" : "FooBar"; 
using (var conn = new SqlConnection(connectionString))
{
    conn.Insert(myFooBar);
    string insertSql = $"INSERT INTO {theTable} ([Id], [Foo], [Bar]) VALUES @FooBarObj.Id, @...)";            
    var result = conn .Execute(insertSql , myFooBar);
}

我认为 flyte 有很好的答案,他的解决方案肯定可行,Dapper.Contrib 项目非常有用。

只是为了提供另一种解决方案,或者至少是一种稍微不同的看待它的方式。首先我觉得所有实体应该只代表一个table,这样以后两个table分叉的时候就清楚了。

因此,您可能想要尝试做的是有两个 类,其中副本扩展了原始文件(或者是原始文件的副本)。 然后在需要插入重复条目时使用映射器(选择任何一个)。

[Table("Original")]
public class Original
{
    //properties
}

[Table("Duplicate")]
public class Duplicate : Original
{
    //properties
}

然后当你的条件满足时。

if (something)
{
    var dup = _mapper.Map<Original, Duplicate>(orig);
    conn.Insert(dup);
}

希望对您有所帮助。

您可以使用 EF 或 PetaPoco

  • 我的建议是PetaPoco,因为它非常简单和有效。

如果你正在处理大数据那么我的建议

  • EntityFramework

你的对象

[TableName("Administrators")]
[PrimaryKey("dbid", autoIncrement = true)]
class Administrators
{
    public int dbid { get; set; }
    public string Name { get; set; }
    public string SurName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

插入语句

var Administrators= new Administrators{ 
Name = "Mami", 
Surname= "Dora" 
};

object getObj= db.Insert(Administrators);

基本示例(获取和设置)

App.config

 <connectionStrings>
    <add name="PetaExample" connectionString="Data Source=MDORA17\SQLEXPRESS;Initial Catalog=mdblog;Integrated Security=True;Connect Timeout=300;" providerName="System.Data.SqlClient" />
  </connectionStrings>

GET

 static void Main(string[] args)
        {
            using (var db = new Database("PetaExample"))
            {
                try
                {
                    var result = db.Query<Administrators>("select * from mdpub.Administrators").ToList();

                    result.ForEach(ShowPerson);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            Console.ReadKey();
        }

        private static void ShowPerson(Administrators admin)
        {
            Console.WriteLine("{0} {1} ", admin.Name, admin.SurName);
        }

设置

static void Main(string[] args)
        {
            using (var db = new Database("PetaExample"))
            {
                try
                {
                    var Administrators = new Administrators
                    {
                        Name = "Mami",
                        SurName = "Dora",
                    };

                    db.Insert("mdpub.Administrators", "dbid", true, Administrators);
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

            Console.ReadKey();
        }


    }
    public class Administrators
    {
        public int dbid { get; set; }
        public string Name { get; set; }
        public string SurName { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }

    }