2013-11-18 3 views
2

Я сейчас работаю над приложением, и нам нужно добавить переход, среди прочего, включить FILESTREAM на SQL-сервере. Мой метод Up() выглядит следующим образом:Переходы базы данных EF5: как включить FILESTREAMS

public override void Up() 
    { 
     //Enable filestream 
     Sql("USE master " + 
      "Go " + 
      "EXEC sp_configure 'show advanced options' " + 
      "GO " + 
      "EXEC sp_configure filestream_access_level, 1 " + 
      "GO " + 
      "RECONFIGURE WITH OVERRIDE " + 
      "GO"); 
     //Need to add some script here to create FILEGROUP and add a file to that 
     //file group to be used by FILESTREAM 
     CreateTable(
      "dbo.PatientAttachmentEntities", 
      c => new 
       { 
        Id = c.Guid(nullable: false), 
        PatientMedicalDataId = c.Guid(nullable: false), 
        FileName = c.String(nullable: false), 
        FileDescription = c.String(), 
       }) 
      .PrimaryKey(t => t.Id) 
      .ForeignKey("dbo.PatientMedicalDataEntities", t => t.PatientMedicalDataId, cascadeDelete: true) 
      .ForeignKey("dbo.AttachmentContentEntities", t => t.Id) 
      .Index(t => t.PatientMedicalDataId) 
      .Index(t => t.Id); 

    //CreateTable(
    //   "dbo.AttachmentContentEntities", 
    //   c => new 
    //    { 
    //     Id = c.Guid(nullable: false), 
    //     //Need to know if the following line is ok to setup a FILESTREAM column 
    //     Content = c.Binary(storeType:"varbinary(max) FILESTREAM", nullable:true), 
    //    }) 
    //   .PrimaryKey(t => t.Id); 
    Sql("CREATE TABLE [dbo].[AttachmentContentEntities](" + 
     "[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL PRIMARY KEY, " + 
     "[Content] [varbinary](max) FILESTREAM NOT NULL) " + 
     "ON [PRIMARY] FILESTREAM_ON [MEDIC_FS]"); 
    } 

Мне нужен SQL скрипт для добавления группы файлов и файл в этой группе (файл должен быть на том же пути, чем мой файл базы данных), а также мне нужно знаете, если скрипт, который я уже добавляю, в порядке, и если тип, который я накладываю на метод c.Binary, - Ok.

Большое спасибо.

ответ

1

У меня, наконец, есть решение для этого, я думаю, что нет возможности включить filestream на уровне Windows с помощью скриптов, но остальная конфигурация может быть достигнута с использованием этого кода. Надеюсь, это может помочь кому-то.

public override void Up() 
{ 
    //File Stream 
     Sql("USE master " + 
      "EXEC sp_configure 'show advanced options' " + 
      "EXEC sp_configure filestream_access_level, 1 " + 
      "RECONFIGURE WITH OVERRIDE " + 
      "ALTER DATABASE Medic " + 
      "ADD FILEGROUP MEDIC_FS " + 
      "CONTAINS FILESTREAM " + 
      "DECLARE @db_path NVARCHAR(MAX) " + 
      "SELECT @db_path = physical_name FROM sys.master_files WHERE database_id = DB_ID(N'Medic') AND type_desc = 'ROWS' " + 
      @"SET @db_path = REVERSE(RIGHT(REVERSE(@db_path),(LEN(@db_path)-CHARINDEX('\', REVERSE(@db_path),1))+1)) + 'MEDIC_FS' " + 
      "DECLARE @Sql NVARCHAR(MAX) " + 
      "SET @Sql = 'ALTER DATABASE Medic ADD FILE (NAME= ''Medic_FS'', FILENAME = ' + QuoteName(@db_path,'''') + ') TO FILEGROUP MEDIC_FS' " + 
      "EXEC(@Sql) ", suppressTransaction: true);   
    CreateTable(
     "dbo.PatientAttachmentEntities", 
     c => new 
      { 
       Id = c.Guid(nullable: false), 
       PatientMedicalDataId = c.Guid(nullable: false), 
       FileName = c.String(nullable: false), 
       FileDescription = c.String(), 
      }) 
     .PrimaryKey(t => t.Id) 
     .ForeignKey("dbo.PatientMedicalDataEntities", t => t.PatientMedicalDataId, cascadeDelete: true) 
     .ForeignKey("dbo.AttachmentContentEntities", t => t.Id) 
     .Index(t => t.PatientMedicalDataId) 
     .Index(t => t.Id); 

    Sql("CREATE TABLE [dbo].[AttachmentContentEntities](" + 
    "[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL PRIMARY KEY, " + 
    "[Content] [varbinary](max) FILESTREAM NOT NULL) " + 
    "ON [PRIMARY] FILESTREAM_ON [MEDIC_FS]"); 
} 

Это работает нормально для меня.

Смежные вопросы