2017-10-27 1 views
5

Ich habe ein Objekt mit Eigenschaftennamen, die genau die Feldnamen in der DB-Tabelle benennen, aber ich bin mir nicht sicher, wie ich es einfügen soll. Das einzige, was anders ist, ist der DB-Tabellenname. Es ist also ein Objekt mit einem Namen für ein anderes Modell/eine andere zugeordnete Tabelle, aber ich möchte, dass es in eine Tabelle mit einem anderen Namen als das Modell eingefügt wird. Ich versuchte dies:Objekt einfügen, das je nach Szenario in unterschiedliche DB-Tabelle gemappt werden soll

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

Wo z.B.

Objekt ist FooBarObj und Eigenschaften sind int Id, string Foo, string Bar

und die hat die Feldnamen: Id, Foo, and Bar aber die Tabelle ist nicht FooBarObj genannt, es genannt wird.

Wie kann ich so etwas einfügen? Ich verwende Dapper

EDIT:

Kann ich zwei Tabelle für FooBar Modell Attribute?

z. [Table("DBInformation")] und [Table("FooBar")].

Ich habe einen seltsamen Rand Fall, wo ich in FooBar einfügen möchte, wenn dieses Szenario auftritt, wenn ein anderes Szenario auftritt, in DBInformation einfügen. Das ist das Problem, dem ich momentan gegenüberstehe, und deshalb kann ich nicht einfach das Attribut hinzufügen und für dieses Problem fertig sein.

+0

Sind die beiden Einheiten logisch verschieden, dh sie Dinge – sQuir3l

+0

@ sQuir3l tun darstellen, ja und nein. Grundsätzlich ist die andere Entität ein Duplikat der ersten Entität und die zweite Entität ist die Stelle, an der die Duplikate der ersten Entität gespeichert werden. – Euridice01

Antwort

4

Überprüfen Sie die Dapper.Contrib Projekt. Sie können Ihre Modellklassen mit einigen nützlichen Attributen dekorieren.

Verwenden Sie das Table Attribut auf Ihrer FooBar Klasse zu identifizieren, dass dies auf die Tabelle zugeordnet werden soll. Zum Beispiel:

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

Und ein weiterer Vorteil Dapper.Contrib ist, dass es erlaubt Ihnen, CRUD-Operationen sehr leicht durchzuführen. Zum Beispiel für Einsatz:

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

und für Updates:

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

usw.

EDIT

zu begegnen, was Ihr "echtes" Problem ist, (Ihre neueste Bearbeiten Sie aus dem Original, wo Sie möglicherweise in zwei Tabellen abhängig von einem bestimmten Szenario einfügen, dann würde ich zurückgehen, nur Ihre SQL anzupassen dass Sie bieten adrett:

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

Kann ich zwei Tabellenattribute für das FooBar-Modell haben? Z.B. [Tabelle ("DBInformation")] und [Tabelle ("FooBar")]. Ich habe einen seltsamen Randfall, wo ich in FooBar einfügen möchte, wenn dieses Szenario auftritt, wenn ein anderes Szenario auftritt, in DBInformation einfügen. Das ist das Problem:/Danke @flyte – Euridice01

+0

Das ist ein seltsamer Fall - ich bin mir nicht sicher. Sie müssen weiter in Dapper und Dapper. Contrib auf, wie man damit umgehen. Abstimmen und akzeptieren Antwort, wenn dieser Beitrag Ihnen bei Ihrer ursprünglichen Frage geholfen hat. – flyte

+0

Aw ok. Leider kann ich es nicht als akzeptiert markieren, da ich bereits das was du schon erwähnt hast eingerichtet habe. Es ist das Problem, dass ich erwähnte, dass ich Probleme mit :(Ich werde meinen Beitrag bearbeiten, um es klarer zu machen. – Euridice01

1

Ich denke flyte einen guten Teil der Antwort und seine Lösung könnte sicherlich arbeiten, und das Dapper.Contrib Projekt ist sehr nützlich hat.

Nur um eine andere Lösung oder zumindest eine etwas andere Sichtweise zu geben. Erstens glaube ich, dass alle Entitäten nur eine Tabelle repräsentieren sollten, sie wird die Dinge in Zukunft klar halten, falls die beiden Tabellen auseinander gehen.

Sie möchten also versuchen, zwei Klassen zu haben, in denen das Duplikat das Original erweitert (oder eine Kopie davon ist). Verwenden Sie dann einen Mapper (wählen Sie einen), wenn Sie den doppelten Eintrag einfügen müssen.

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

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

Dann, wenn Sie Bedingung erfüllt ist.

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

Hoffe, das hilft.

+0

Was ist Mapper in diesem Fall? Vielen Dank! – Euridice01

+0

eine generische, die ich in einigen meiner Projekte habe. Aber AutoMapper ist wahrscheinlich die meisten Leute gehen zu – sQuir3l

+0

Können Sie zeigen, wie Sie AutoMapper dafür einrichten? – Euridice01

0

Sie EF oder PetaPoco verwenden können

  • Mein Vorschlag ist PetaPoco weil sehr einfach und affektiven.

, wenn Sie mit großen Daten zu tun haben, dann ist mein Vorschlag

  • EntityFramework

Ihr Objekt

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

Anweisung Einfügen

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

object getObj= db.Insert(Administrators); 

Basic-Beispiel (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; } 

    } 
Verwandte Themen