2011-06-08 23 views
5

Puedo usar LINQ para crear una base de datos con algunas tablas constituyentes usando datacontext.createDatabase(). El problema es que, cada vez que quiero agregar una nueva tabla a la base de datos y utilizar este método, primero tengo que eliminar la base de datos y luego recrear toda la base de datos con la tabla adicional. Obviamente, esto borra todos los contenidos con los que había llenado previamente las tablas.Usando LINQ to SQL para crear una base de datos

¿Hay alguna manera de simplemente agregar la nueva tabla en la base de datos sin volver a crearla desde el principio?

Respuesta

0

No, no hay tal característica disponible en este momento.

Ni siquiera en EF4 - al menos por ahora ...... estos bits aquí (Code-First Database Evolution) no lo hacen en la versión final EF 4.1 .... :-(

escucho de Microsoft equipos están trabajando duro en una solución (EF "Migraciones") - pero todavía se está trabajando en

+0

Sin embargo, puede tener una clase de datos de muestra que llenará su base de datos cuando se vuelva a crear. Supongo que podría funcionar para el desarrollo. – noinstance

+0

@nosuchnick: eso está en el código de EF 4.1 primero, ¿verdad? No crea que Linq-to-SQL tiene algo similar ... –

+0

Huh, probablemente. Estoy usando Linq y EF por primera vez ahora, con EF4.1. – noinstance

3

veo dos maneras de hacerlo

primera

puede utilizar el ExceuteCommand -method de la DataContext ejecutar algunas declaraciones T-SQL para crear tablas.

y segundo

puede utilizar esta función truco si ha mapeado tipo de tabla, como se sugiere here

public void CreateTable(Type linqTableClass) 
{ 
    using (var tempDc = new DmsDataContext()) 
    { 
     var metaTable = tempDc.Mapping.GetTable(linqTableClass); 
     var typeName = "System.Data.Linq.SqlClient.SqlBuilder"; 
     var type = typeof(DataContext).Assembly.GetType(typeName); 
     var bf = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod; 
     var sql = type.InvokeMember("GetCreateTableCommand", bf, null, null, new[] { metaTable }); 
     var sqlAsString = sql.ToString(); 
     tempDc.ExecuteCommand(sqlAsString); 
    } 
} 
+0

+1 Su primera opción es lo que solíamos hacer cuando estábamos usando L2S. Creamos un conjunto de declaraciones a partir de información de diferencias creada programáticamente en el modelo y lo ejecutamos. Funcionó bien – UrbanEsc

0

El código adjunto crea una base de datos, dynamicDatabase11, y una mesa, books.

public class MyDatabse : DataContext 
{ 
    public Table<Bookss> Bookss; 
    public MyDatabse(string connection) : base(connection) { } 
} 

[Table(Name = "Books")] 
public class Bookss 
{ 
    [Column(IsPrimaryKey = true)] 
    public string Title; 
    [Column] 
    public string Rating; 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     CreateDatabase("DynamicDatabase11"); 
    } 
    public static void CreateDatabase(string Dbname) 
    { 

     MyDatabse db = new MyDatabse("ConString"+Dbname+""); 
     db.CreateDatabase(); 
    } 
} 
+0

¿Y cómo responde esto a la pregunta de OP? – UrbanEsc