Вставка объекта, который должен быть отображен в другую таблицу БД в зависимости от сценария

У меня есть объект с именами свойств, которые точно называют имена полей внутри таблицы БД, но я не уверен, как его вставить. Единственное, что отличается - это имя таблицы БД. Так что это объект с именем другой модели / сопоставленной таблицы, но я хочу, чтобы он был вставлен в таблицу с именем, отличным от модели. Я попробовал это:

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. Это проблема, с которой я сейчас сталкиваюсь, и поэтому я не могу просто добавить атрибут и покончить с этой проблемой.

3 ответа

Решение

Ознакомьтесь с проектом 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, которую вы предоставляете 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("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);

Базовый пример (Get & Set)

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>

ПОЛУЧИТЬ

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

    }
Другие вопросы по тегам