5

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

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 模型可以有两个表属性吗?

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

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

4

3 回答 3

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

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

并进行更新:

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

等等

编辑

为了解决您的“真正”问题是什么(您对原始文件的最新编辑),您需要根据特定场景可能插入两个表,然后我会回到只是调整您提供的 SQL:

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);
}
于 2017-10-27T15:47:08.267 回答
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);
}

希望这可以帮助。

于 2017-11-10T05:19:47.633 回答
0

您可以使用 EF 或 PetaPoco

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

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

  • 实体框架

你的对象

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

基本示例(获取&设置)

应用程序配置

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

得到

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

    }
于 2017-11-15T17:39:42.687 回答