使用DataContext.CreateDatabase()时如何控制数据库索引的创建

时间:2010-02-26 09:52:57

标签: linq-to-sql database-design

我是LINQ to SQL的新手,但过去做过很多数据库开发。

我刚开始使用的软件使用:

// 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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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);
    }
}