Como: criar um banco de dados dinamicamente

No LINQ to SQL, um modelo de objeto é mapeado para um banco de dados relacional. O mapeamento é habilitado usando o mapeamento baseado em atributo ou um arquivo de mapeamento externo para descrever a estrutura do banco de dados relacional. Em ambos os cenários, há informações suficientes sobre o banco de dados relacional para que você possa criar uma nova instância do banco de dados usando o método DataContext.CreateDatabase.

O método DataContext.CreateDatabase cria uma réplica do banco de dados somente para a extensão das informações codificadas no modelo de objeto. Os arquivos de mapeamento e os atributos no modelo de objeto podem não codificar tudo sobre a estrutura de um banco de dados existente. As informações de mapeamento não representam o conteúdo das funções definidas pelo usuário, dos procedimentos armazenados, dos gatilhos ou das restrições de verificação. Esse comportamento é suficiente para vários bancos de dados.

Você pode usar o método DataContext.CreateDatabase em diversos cenários, especialmente se um provedor de dados conhecido como o Microsoft SQL Server 2008 estiver disponível. Os cenários comuns são os seguintes:

  • Você está criando um aplicativo que se instala automaticamente em um sistema de cliente.

  • Você está criando um aplicativo cliente que precisa de um banco de dados local para salvar seu estado offline.

Você também pode usar o método DataContext.CreateDatabase com o SQL Server usando um arquivo .mdf ou um nome de catálogo, dependendo da cadeia de conexão. O LINQ to SQL usa a cadeia de conexão para definir o banco de dados a ser criado e em qual servidor o banco de dados deve ser criado.

Observação

Sempre que possível, use a Segurança Integrada do Windows para se conectar ao banco de dados, de modo que não sejam necessárias senhas na cadeia de conexão.

Exemplo 1

O código a seguir fornece um exemplo de como criar um novo banco de dados chamado MyDVDs.mdf.

public class MyDVDs : DataContext
{
    public Table<DVD> DVDs;
    public MyDVDs(string connection) : base(connection) { }
}

[Table(Name = "DVDTable")]
public class DVD
{
    [Column(IsPrimaryKey = true)]
    public string Title;
    [Column]
    public string Rating;
}
Public Class MyDVDs
    Inherits DataContext
    Public DVDs As Table(Of DVD)
    Public Sub New(ByVal connection As String)
        MyBase.New(connection)
    End Sub
End Class

<Table(Name:="DVDTable")> _
Public Class DVD
    <Column(IsPrimaryKey:=True)> _
    Public Title As String
    <Column()> _
    Public Rating As String
End Class

Exemplo 2

Você pode usar o modelo de objeto para criar um banco de dados fazendo o seguinte:

public void CreateDatabase()
{
    MyDVDs db = new MyDVDs("c:\\mydvds.mdf");
    db.CreateDatabase();
}
Public Sub CreateDatabase()
    Dim db As New MyDVDs("c:\...\mydvds.mdf")
    db.CreateDatabase()
End Sub

Exemplo 3

Ao compilar um aplicativo que se instala automaticamente em um sistema do cliente, verifique se o banco de dados já existe e descarte-o antes de criar um novo. A classe DataContext fornece os métodos DatabaseExists e DeleteDatabase para ajudar nesse processo.

O exemplo a seguir mostra uma maneira de implementar essa abordagem através desses métodos:

public void CreateDatabase2()
{
    MyDVDs db = new MyDVDs(@"c:\mydvds.mdf");
    if (db.DatabaseExists())
    {
        Console.WriteLine("Deleting old database...");
        db.DeleteDatabase();
    }
    db.CreateDatabase();
}
Public Sub CreateDatabase2()
    Dim db As MyDVDs = New MyDVDs("c:\...\mydvds.mdf")
    If db.DatabaseExists() Then
        Console.WriteLine("Deleting old database...")
        db.DeleteDatabase()
    End If
    db.CreateDatabase()
End Sub

Confira também