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

どのようになりたいか (オブジェクト ctx の作成時に欠落しているデータベース パラメーターと、クラス MyContext の前のデータベース名の追加のカスタム属性に注意してください):

[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」という例外をスローします。何か不足していますか?カスタム属性を使用するのは初めてです...

4

2 に答える 2

1

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

于 2009-05-28T16:47:14.857 に答える
0

デザイナーを使用して VS から作成されたコンテキストを見ると、クラスに静的メンバーがあります。

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

ここに Context クラスの冒頭があります:

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

これは単なるコンストラクターです...クラス全体ではありません...しかし、自分で確認するには、Linq to Sql Classes テンプレートの作成を選択した後、サーバー エクスプローラーからテーブルをドラッグするだけです。

于 2009-05-28T16:56:15.197 に答える