Указание папки миграции также возможно во время вызова команды enable-migrations
(которая создает класс Configuration
) с использованием параметра -MigrationsDirectory
:
enable-migrations -EnableAutomaticMigration:$false -MigrationsDirectory Migrations\CustomerDatabases -ContextTypeName FullyQualifiedContextName
В примере будет создан Configuration
класс, который устанавливает MigrationsDirectory
в указанную папку «Migrations \ CustomerDatabases», которая относится к корневой папке проектов.
public Configuration()
{
AutomaticMigrationsEnabled = false;
MigrationsDirectory = @"Migrations\CustomerDatabases";
}
См. Также эту статью , в которой рассказывается о проекте с несколькими контекстами и папками миграции.
Кстати, если вы используете несколько папок миграции и несколько контекстов, пожалуйста, подумайте также о том, чтобы установить имя для схемы по умолчанию в методе OnModelCreating
вашего производного класса DbContext
(где конфигурация Fluent-API) является). Это будет работать в EF6:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("CustomerDatabases");
}
Префикс таблиц базы данных префикса с именем схемы. Это позволит вам использовать более одного контекста с одной базой данных в сценарии, где у вас есть несколько групп таблиц, которые не зависят друг от друга. (Это также создаст отдельные версии таблиц MigrationHistory, в приведенном выше примере это будет CustomerDatabases.__MigrationHistory
).
Решение из моего сообщения в блоге (указанное в OP) было основано на существующем решении, которое мы использовали / используем для изменения кодов ответа HTTP во время состояния ошибки.
Итак, для нас это было однострочное изменение, чтобы передать исключение в ELMAH. Если есть лучшее решение, я тоже хотел бы знать об этом.
Для постеров / справок и потенциальных улучшений - вот код из текущего решения.
using System;
using System.ServiceModel;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Collections.ObjectModel;
using System.Net;
using System.Web;
using Elmah;
namespace YourApplication
{
/// <summary>
/// Your handler to actually tell ELMAH about the problem.
/// </summary>
public class HttpErrorHandler : IErrorHandler
{
public bool HandleError(Exception error)
{
return false;
}
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error != null ) // Notify ELMAH of the exception.
{
if (System.Web.HttpContext.Current == null)
return;
Elmah.ErrorSignal.FromCurrentContext().Raise(error);
}
}
}
/// <summary>
/// So we can decorate Services with the [ServiceErrorBehaviour(typeof(HttpErrorHandler))]
/// ...and errors reported to ELMAH
/// </summary>
public class ServiceErrorBehaviourAttribute : Attribute, IServiceBehavior
{
Type errorHandlerType;
public ServiceErrorBehaviourAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}
public void Validate(ServiceDescription description, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection parameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandler;
errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher;
channelDispatcher.ErrorHandlers.Add(errorHandler);
}
}
}
}
Украсьте свои службы WCF атрибутом ServiceErrorBehaviour:
[ServiceContract(Namespace = "http://example.com/api/v1.0/")]
[ServiceErrorBehaviour(typeof(HttpErrorHandler))]
public class MyServiceService
{
// ...
}
Я сделал это на основе работы Уилла но я хочу убедиться, что это правильный подход перед публикацией code.
Я думаю, что это отличный подход (спасибо Уиллу за эту публикацию!). Не думаю, что Уилл или вы что-то здесь упустили. Реализация IErrorHandler - это предпочтительный способ перехвата всех возможных исключений на стороне сервера, которые в противном случае могли бы вызвать сбой в канале связи (разрушение), и, таким образом, это естественное место для подключения некоторых журналов, таких как ELMAH.
Marc
Я не пробовал делать это явно с помощью REST, и сам не использовал ELMAH, но стоит рассмотреть еще один вариант - подключиться к WCF с использованием IDispatchMessageInspector вместо IErrorHandler.