2009-05-28 5 views
0

Ich sehe gerade ein Video über [LINQ] [1] und stieß auf ein Problem. In diesem Video verwendet Mike einige benutzerdefinierte Attribute für den Datenbanknamen, und das funktioniert nicht für mich.Verwenden von benutzerdefinierten Attributen

Mein Code (das funktioniert):

class MyContext : DataContext 
{ 
    public MyContext(string conStr) : base(conStr) 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyContext ctx = new MyContext("server=.;database=AdventureWorks;Integrated Security=SSPI"); 
     Console.WriteLine(ctx.Connection.ConnectionString); 
     ctx.ExecuteCommand("insert into _table (a, b) select {0}, {1}", "5", "B"); 

     Console.WriteLine("That's it!"); 
     Console.ReadLine(); 
    } 
} 

Wie ich möchte es die fehlende Datenbank Parameter bei der Erstellung des Objekts ctx und zusätzliche benutzerdefinierte Attribute für Datenbanknamen vor der Klasse mycontext sein (man beachte):

[Database(Name="AdventureWorks")] 
class MyContext : DataContext 
{ 
    public MyContext(string conStr) : base(conStr) 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyContext ctx = new MyContext("server=.;Integrated Security=SSPI"); 
     Console.WriteLine(ctx.Connection.ConnectionString); 
     ctx.ExecuteCommand("insert into _table (a, b) select {0}, {1}", "5", "B"); 

     Console.WriteLine("That's it!"); 
     Console.ReadLine(); 
    } 
} 

Diese Ausnahme ‚ungültige Objektnamen _table‘ wirft, wie nur würde ich keine Datenbanknamen definieren. Fehle ich etwas? Es ist das erste Mal mit benutzerdefinierten Attributen, ...

Antwort

1

Sie müssen immer noch das Attribut lesen. Sie müssen Reflektion verwenden, um den Wert in Ihrem myContextConstructor zu analysieren.

0

im Kontext von VS erstellt Suche mithilfe des Designers es ein statisches Element in der Klasse hat:

private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource(); 

hier der Beginn der Kontextklasse:

[Database(Name = "Blah")] 
    public partial class TestDataContext : System.Data.Linq.DataContext 
    { 

     private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource(); 

    #region Extensibility Method Definitions 
    partial void OnCreated(); 
    partial void InsertAdmin(Admin instance); 
    partial void UpdateAdmin(Admin instance); 
    partial void DeleteAdmin(Admin instance); 
    partial void InsertUser(User instance); 
    partial void UpdateUser(User instance); 
    partial void DeleteUser(User instance); 
    #endregion 

     public TestDataContext() : 
       base(global::TestStuff.Properties.Settings.Default.FraudAnalystConnectionString, mappingSource) 
     { 
      OnCreated(); 
     } 

     public TestDataContext(string connection) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public TestDataContext(System.Data.IDbConnection connection) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public TestDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

     public TestDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : 
       base(connection, mappingSource) 
     { 
      OnCreated(); 
     } 

, die gerade das ist Konstruktoren ... nicht die ganze Klasse ... aber um selbst zu sehen, ziehen Sie einfach eine Tabelle von Ihrem Server Explorer, nachdem Sie die Vorlage für Linq to Sql Classes erstellt haben.