2013-12-12 2 views
0

Я сделал несколько поисков, и я не смог найти многого для использования фильтра с OrmLite. Я думаю, что это возможно, но я не уверен, в каком направлении идти.OrmLite With Filestream

В идеале, я хотел бы иметь возможность создавать или отбрасывать/создавать таблицу на основе модели с двоичным полем, а затем делать что-то, чтобы сделать этот столбец в базе данных, сопоставленной с файловым потоком. Я знаю, что филимент должен быть установлен на сервере sql раньше времени (я не думаю, что вы можете выполнить ВСЕ настройку потока из-за пределов Management Studio/Configuration Manager)

Есть ли способ сделать это, используя OrmLite? Я нашел эту часть:

db.ExecuteNonQuery ("UPDATE Person SET LastName = @ name WHERE Id = @ id", new {name = "WaterHouse", id = 7});

И:

CREATE TABLE Archive.dbo.Records ( [Id] [UniqueIdentifier] ROWGUIDCOL NOT NULL UNIQUE, [SerialNumber] INTEGER UNIQUE, [Таблица] VARBINARY (MAX) FILESTREAM NULL ) GO

ALTER TABLE может работать, но я не могу понять, как объединить модификацию только одного столбца, используя SQL в OrmLite или Ormlite самостоятельно.

ответ

0

Это не совсем возможно из коробки с OrmLite, но вы можете написать метод расширения, который использует базу OrmLite для выполнения того, что вы хотите (код ниже - v3). Этот метод просто падает все VARBINARY колонн и повторно добавляет их в качестве: потокового видео

public static class OrmLiteBinaryCreateExtensions 
{ 
    /// <summary> 
    /// WARNING: this will drop all of the existing varbinary columns! 
    /// </summary> 
    public static void UpdateByteToBinary<T>(this IDbConnection dbConn) 
    { 
     var modelDef = ModelDefinition<T>.Definition; 
     var tableName = OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef); 
     var definitions = modelDef.FieldDefinitions.Where<FieldDefinition>(f => f.FieldType == typeof(byte[])); 

     foreach (var def in definitions) 
     { 
      var columnName = OrmLiteConfig.DialectProvider.GetQuotedColumnName(def.FieldName); 
      dbConn.ExecuteNonQuery(string.Format("ALTER TABLE {0} DROP COLUMN {1}", tableName, columnName)); 
      dbConn.ExecuteNonQuery(string.Format("ALTER TABLE {0} ADD {1} [varbinary](max) filestream NULL", tableName, columnName)); 
     } 
    } 
} 

Использование:

using (IDbConnection db = dbFactory.OpenDbConnection()) 
{ 
    // create temp file, read bytes, delete it 
    var tmp = Path.GetTempFileName(); 
    using (var fs = new FileStream(tmp, FileMode.OpenOrCreate)) 
    { 
     var textBytes = System.Text.Encoding.UTF8.GetBytes("some text"); 
     fs.Write(textBytes, 0, textBytes.Length); 
    } 
    byte[] bytes = File.ReadAllBytes(tmp); 
    File.Delete(tmp); 


    // stand up data in orm lite 
    db.CreateTableIfNotExists<FileExample>(); 

    // here is our extension method - note that this will drop the entire file column 
    // and lose all existing data 
    db.UpdateByteToBinary<FileExample>(); 

    db.Insert<FileExample>(new FileExample { Name = "my new file", FileBytes = bytes }); 

    // read data back to ensure it saved properly 
    var files = db.Select<FileExample>(); 

    using (var ms = new MemoryStream(files[0].FileBytes)) 
    { 
     var someText = System.Text.Encoding.UTF8.GetString(files[0].FileBytes); 

     Console.WriteLine(someText); 
    } 

    db.DropTable<FileExample>(); 
} 
+0

Спасибо это объясняет это хорошо – Dru