Использование пользовательских атрибутов - PullRequest
0 голосов
/ 28 мая 2009

Я смотрю видео о [LINQ] [1] и столкнулся с проблемой. В этом видео Майк использует некоторые пользовательские атрибуты для имени базы данных, и это не работает для меня.

Мой код (который отлично работает):

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', точно так же, как я бы не определил имя базы данных. Я что-то пропустил? Я впервые использую пользовательские атрибуты, ...

Ответы [ 2 ]

1 голос
/ 28 мая 2009

Вам все еще нужно прочитать атрибут. Вам нужно будет использовать отражение для анализа значения в вашем myContextConstructor.

0 голосов
/ 28 мая 2009

Глядя на контекст, созданный из 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.

...