首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带Filestream的OrmLite

带Filestream的OrmLite
EN

Stack Overflow用户
提问于 2013-12-12 04:48:56
回答 1查看 305关注 0票数 0

我做了一些搜索,但在使用OrmLite时找不到很多。我认为这是可能的,但我不知道该朝哪个方向走。

理想情况下,我希望能够基于带有二进制字段的模型创建或删除/创建一个表,然后在数据库中将该列映射到filestream。我知道必须提前在sql服务器上安装filestream (我不认为您可以在Management / Configuration之外完成所有filestream设置)

是否有一种使用OrmLite来实现此操作的方法?我确实找到了这部分:

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

和:

创建表Archive.dbo.Records ( Id ROWGUIDCOL NOT NULL唯一,SerialNumber整数唯一,图表VARBINARY(最大) FILESTREAM NULL ) GO

ALTER可能会工作,但我不知道如何结合使用OrmLite或Ormlite中的SQL单独修改一个列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-13 16:09:44

这在OrmLite中是不太可能的,但是您可以编写一个扩展方法,它使用OrmLite基来做您想做的事情(下面的代码是v3)。此方法只需删除所有var二元列并将它们作为filestreams重新添加:

代码语言:javascript
复制
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));
        }
    }
}

用法:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20535267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档