2010-02-26 26 views
2

我是新来的LINQ to SQL,但过去做了很多的数据库开发。我怎样才能控制创建数据库索引时使用DataContext.CreateDatabase()

的软件,我刚开始工作的用途:

// MyDataContext is a sub class of DataContext, that is generated with SqlMetal 
MyDataContext db = new MyDataContext (connectionString); 
db.CreateDatabase(); 

创建数据库时,它是第一次运行。

我需要在表中添加一些索引....
我该如何告诉DataContext我想要什么索引?

否则我该如何控制它?

(我可以用一个SQL脚本,但我喜欢DB理想。CreateDatabase总是会创建一个数据访问代码相匹配的数据库)

(为了更好的,或者更糟的软件具有完全访问数据库服务器和我们的软件经常动态创建以模型的结果存储到数据库运行等,所以请不要告诉我,我们不应该从创建数据库的代码)


我似乎不是唯一的人命中DataContext.CreateDatabase()上的限制也参见http://csainty.blogspot.com/2008/02/linq-to-sql-be-careful-of.html

回答

1

据我所知,DataContext.CreateDatabase方法只能创建主键。

当您直接查看DBML时,将会看到没有用于定义索引的元素。因此,恕我直言,保存假设CreateDatabase不能这样做。

因此,我能想到的自动创建索引的唯一方法是首先调用DataContext.CreateDatabase,然后调用DataContext.ExecuteCommand将索引添加到刚刚创建的表中。

+0

谢谢,我也得出了同样的结论,但我遇到的问题是我不希望的主键是一个聚集索引,因为我有一个DateTime列,很多范围查询的是完成。 – 2010-03-03 10:18:12

+1

总是要记住Linq to SQL更像是一种便利的工具。它很容易使用,但它不能提供“propper”ORM的完全灵活性。我们将不得不等待.NET 4.0和实体框架带给我们的东西 - 希望它可以在那时使用。这里有一个链接到.NET 4.0中的Linq(nice pun)中的变化http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40。 – AxelEckenberger 2010-03-03 11:13:44

0

您可以在DatabaseCreated方法上执行SQL命令。

public partial class DatabaseModelsDataContext : System.Data.Linq.DataContext 
{ 
    partial void OnCreated() 
    { 

     var cmdText = @" 
      IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_LeafKey') 
      DROP INDEX IX_MyTableColumn 
      ON [mydb].[dbo].[Leaf]; 
      CREATE INDEX IX_MyTableColumn 
      ON [mydb].[dbo].[MyTable] ([column]) ;"; 

      ExecuteCommand(cmdText); 
    } 
}