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

时间:2017-10-27 15:33:28

标签: c# sql-server dapper dapper-contrib

我有一个对象,其属性名称确切地命名了DB表中的字段名称,但我不确定如何插入它。 唯一不同的是DB表名。所以它是一个具有不同模型/映射表名称的对象,但我希望将它插入到一个名称与模型不同的表中。 我试过这个:

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,但该表名为FooBarObj,称为DBInformation

我怎样才能插入这样的东西?我正在使用Dapper

编辑:

我可以为FooBar模型提供两个表属性吗?

E.g。 [Table("DBInformation")][Table("FooBar")]

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

3 个答案:

答案 0 :(得分:4)

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

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

[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操作。例如,对于insert:

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

和更新:

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

修改

要解决您的“真正”问题,(您最近的原始编辑),您需要根据特定方案插入两个表,然后我会回到调整您提供的SQL hardy中:

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);
}

答案 1 :(得分:1)

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

只是给出另一种解决方案或至少稍微不同的方式来看待它。首先,我觉得所有实体应该只代表一个表,如果两个表分歧,它将在未来保持清晰。

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

[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);
}

希望这有帮助。

答案 2 :(得分:0)

您可以使用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);
        }

SET

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; }

    }