2009-05-28 6 views
0

Je regarde une vidéo à propos de [LINQ] [1] et j'ai rencontré un problème. Dans cette vidéo, Mike utilise des attributs personnalisés pour le nom de la base de données et cela ne fonctionne pas pour moi.Utilisation des attributs personnalisés

Mon code (qui fonctionne très bien):

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

Comment je voudrais que ce soit (notez le paramètre de base de données manquantes dans la création du CTX d'objet et attribut personnalisé supplémentaire pour le nom de la base de données avant la MyContext de classe):

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

Cette exception lance « invalide nom de l'objet _table », tout comme je ne définirais pas un nom de base de données. Est-ce que je manque quelque chose? C'est la première fois que j'utilise des attributs personnalisés, ...

Répondre

1

Vous devez toujours lire l'attribut. Vous devrez utiliser la réflexion pour analyser la valeur dans votre myContextConstructor.

0

En regardant le contexte créé à partir de VS en utilisant le concepteur, il a un membre statique dans la classe:

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

ici le début de la classe Contexte:

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

qui est juste la constructeurs ... pas toute la classe ... mais pour voir par vous-même, faites glisser votre souris sur une table à partir de l'Explorateur de serveur après avoir choisi de créer le modèle Linq to Sql Classes.

Questions connexes