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 回答