Как я могу контролировать создание индексов базы данных при использовании DataContext.CreateDatabase () - PullRequest
2 голосов
/ 26 февраля 2010

Я новичок в 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 ]

1 голос
/ 03 марта 2010

Насколько я знаю, метод DataContext.CreateDatabase может создавать только первичные ключи.

Если вы посмотрите непосредственно на DBML, вы увидите, что нет элементов для определения индекса. Поэтому, IMHO, можно предположить, что CreateDatabase не может этого сделать.

Таким образом, единственный способ, которым я могу придумать для создания индексов «автоматически», это сначала вызвать DataContext.CreateDatabase, а затем вызвать DataContext.ExecuteCommand, чтобы добавить индексы в только что созданные таблицы.

0 голосов
/ 13 июля 2016

Вы можете выполнить команду SQL для метода DatabaseCreated.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...