2017-10-27 73 views
5

Mam obiekt z nazwami właściwości, które dokładnie nazywają nazwy pól wewnątrz tabeli DB, ale nie jestem pewien jak to wstawić. Jedyną różnicą jest nazwa tabeli DB. Jest to więc obiekt z nazwą innego modelu/zmapowanej tabeli, ale chcę, aby został wstawiony do tabeli o innej nazwie niż model. Próbowałem tego:Wstawianie obiektu, który powinien być odwzorowany na inną tabelę DB w zależności od scenariusza

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

Gdzie np.

Obiekt jest FooBarObj i właściwości są int Id, string Foo, string Bar

i zawiera nazwy pól: Id, Foo, and Bar ale tabela nie nazywa FooBarObj, nazywa .

Jak mogę wstawić coś takiego? Używam Dapper

EDIT:

mogę mieć dwa atrybuty tabeli dla modelu foobar?

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

Mam dziwny przypadek krawędzi, gdzie chcę wstawić do FooBar, jeśli ten scenariusz występuje, jeśli występuje inny scenariusz, wstaw do DBInformation. Na tym właśnie polega problem, dlatego nie mogę po prostu dodać atrybutu i zrobić z nim tego problemu.

+0

są dwa podmioty logicznie różne, że reprezentują one to zrobić rzeczy – sQuir3l

+0

@ sQuir3l, tak i nie. Zasadniczo, druga jednostka jest duplikatem pierwszej jednostki, a druga jest tam, gdzie przechowywane są dupki pierwszej jednostki. – Euridice01

Odpowiedz

4

Sprawdź projekt Dapper.Contrib. Pozwala ci udekorować klasy modelu przy użyciu kilku przydatnych atrybutów.

Użyj atrybutu Table w klasie FooBar, aby określić, że należy go zmapować do tabeli . Na przykład:

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

Kolejną zaletą korzystania z Dapper.Contrib jest to, że pozwala bardzo łatwo wykonywać operacje CRUD. Na przykład, dla wkładki:

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

oraz aktualizacji:

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

itp

EDIT

Aby rozwiązać co twój "prawdziwy" Problem polega na tym, (Twój ostatni edytuj z oryginału), gdzie trzeba potencjalnie wstawić do dwóch tabel w zależności od konkretnego scenariusza, to wróciłbym do justowania twojego SQL które zapewniają elegancki:

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

Czy mogę mieć dwa atrybuty tabeli dla modelu FooBar? Na przykład. [Tabela ("DBInformacja")] i [Tabela ("FooBar")]. Mam dziwny przypadek krawędzi, gdzie chcę wstawić do FooBar, jeśli ten scenariusz występuje, jeśli pojawi się inny scenariusz, wstaw do DBInformation. To jest problem:/Dzięki @flyte – Euridice01

+0

To dziwny przypadek - nie jestem pewien. Będziesz musiał kopać dalej w Dapper i Dapper.Contrib, jak sobie z tym poradzić. Głosuj i Zaakceptuj odpowiedź, jeśli ten post pomógł Ci z oryginalnym pytaniem. – flyte

+0

Aw ok. Niestety, nie można oznaczyć go tak dobrze, jak już wcześniej wspomniano. Właśnie o tym problemie wspomniałem, że mam problem z :(będę edytować mój post, aby był jaśniejszy – Euridice01

1

myślę Flyte ma dobrą część odpowiedzi i jego rozwiązanie z pewnością może pracować, a projekt Dapper.Contrib jest bardzo przydatna.

Wystarczy podać inne rozwiązanie lub przynajmniej nieco inny sposób patrzenia na to. Po pierwsze uważam, że wszystkie podmioty powinny reprezentować tylko jedną tabelę, w przyszłości stanie się ona jasna w przypadku rozbieżności między dwiema tabelami.

Więc możesz spróbować zrobić to mieć dwie klasy, w których duplikat przedłuża oryginał (lub jest jego kopią). Następnie użyj programu odwzorowującego (wybierz dowolny), gdy chcesz wstawić zduplikowany wpis.

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

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

Następnie, gdy warunek jest spełniony.

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

Mam nadzieję, że to pomoże.

+0

Czym jest odwzorowanie? Dzięki! – Euridice01

+0

to rodzajowy, który mam w niektórych moich projektach. Ale AutoMapper jest prawdopodobnie większości ludzi przejść do – sQuir3l

+0

Czy możesz pokazać, jak skonfigurować AutoMapper do tego? – Euridice01

0

można wykorzystywać EF lub PetaPoco

  • Moja sugestia jest PetaPoco ponieważ bardzo proste i afektywne.

jeśli masz do czynienia z dużymi danymi następnie moja propozycja

  • EntityFramework

Twój obiekt

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

INSERT

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

object getObj= db.Insert(Administrators); 

Podstawowe Przykład (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> 

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

    }