2009-05-28 18 views
0

[LINQ] [1]についてのビデオを見ていて、問題が発生しました。このビデオでは、Mikeはデータベース名にいくつかのカスタム属性を使用していますが、それは私のためには機能しません。カスタム属性の使用

(正常に動作します)私のコード:

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(); 
    } 
} 
私はそれがしたいのですがどのように

(クラスあるMyContext前に、データベース名のオブジェクトCTXと追加のカスタム属性の作成時に欠落しているデータベース・パラメータに気づきます):

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

これは、データベース名を定義しないのと同様に、「無効なオブジェクト名_table」をスローします。何か不足していますか?カスタム属性を使用するのは初めてです...

答えて

1

属性を読み取る必要があります。 myContextConstructorの値を解析するには、リフレクションを使用する必要があります。ここでContextクラスの先頭

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

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

だけで、それはクラスの静的メンバを持つデザイナーを使用して、VSから作成されたコンテキストを見てみると

0

コンストラクタは...クラス全体ではありませんが、LinqからSqlクラステンプレートを作成することを選択した後は、サーバエクスプローラからテーブルをドラッグするだけです。