EF7 выдает ArgumentException после вызова set_DeleteBehavior на определенных машинах.

Запуск этого локально в Windows 10 работает нормально, запуск его в Windows Server 2012 R2 вызывает следующее исключение.

Код буквально тот же, после того, как развертывание не сработало, я скопировал локальные файлы на сервер для проверки.

Я просмотрел источник на Github, надеясь найти ответ, но пока не смог найти никакой подсказки. Единственное, что недавно произошло на сервере, это установка .NET 4.6, но приложение всегда было уже собрано для .NET 4.6 и только сейчас начинает выдавать это исключение. Перезагрузка после установки .NET (на всякий случай) также выполнена.

public class Client
{
    public Guid ClientId { get; set; }
    public string Name { get; set; }
    public string Queue { get; set; }        
}

public class StatusUpdate
{
    public Guid StatusUpdateId { get; set; }
    public DateTime UtcDateTime { get; set; }
    public string Type { get; set; }
    public Guid ClientId { get; set; }    
    public Client Client { get; set; }    
}

public class AccessLevel
{
    public Guid ClientId { get; set; }
    public int AccessLevelId { get; set; }
    public string Name { get; set; }
    public DateTime LastUpdatedUtc { get; set; }
    public Client Client { get; set; }
}

public class UserClientLink
{
    public Guid UserId { get; set; }
    public Guid ClientId { get; set; }
    public User User { get; set; }
    public Client Client { get; set; }
}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
{

    modelBuilder.Entity<AccessLevel>().HasKey(a => new {a.ClientId, a.AccessLevelId});
    //Set to -99 since value might range from -5 to max int. Enables inserts with the default sentinel value.
    modelBuilder.Entity<AccessLevel>().Property(p => p.AccessLevelId).Metadata.SentinelValue = -99;

    modelBuilder.Entity<UserClientLink>().HasKey(ucl => new {ucl.ClientId, ucl.UserId});
}

Context.StatusUpdates.Add(statusUpdate);

Для справки, полная трассировка.

System.ArgumentException: The value provided for argument 'value' must be a valid value of enum type 'Microsoft.Data.Entity.Metadata.DeleteBehavior'.
   at Microsoft.Data.Entity.Utilities.Check.IsDefined[T](T value, String parameterName)
   at Microsoft.Data.Entity.Metadata.ForeignKey.set_DeleteBehavior(Nullable`1 value)
   at Microsoft.Data.Entity.Metadata.Internal.InternalEntityTypeBuilder.CreateForeignKey(InternalEntityTypeBuilder principalEntityTypeBuilder, String navigationToPrincipal, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, Nullable`1 isUnique, Nullable`1 isRequired, Nullable`1 deleteBehavior)
   at Microsoft.Data.Entity.Metadata.Internal.InternalEntityTypeBuilder.Relationship(InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, String navigationToPrincipalName, String navigationToDependentName, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, ConfigurationSource configurationSource, Nullable`1 isUnique, Nullable`1 isRequired, Nullable`1 deleteBehavior, Boolean strictPrincipal, Func`2 onRelationshipAdding, Boolean runConventions)
   at Microsoft.Data.Entity.Metadata.Internal.InternalRelationshipBuilder.ReplaceForeignKey(InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, String navigationToPrincipalName, String navigationToDependentName, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, Nullable`1 isUnique, Nullable`1 isRequired, Nullable`1 deleteBehavior, ForeignKeyAspect aspectsConfigured, ConfigurationSource configurationSource, Boolean runConventions)
   at Microsoft.Data.Entity.Metadata.Internal.InternalRelationshipBuilder.ReplaceForeignKey(ForeignKeyAspect aspectsConfigured, ConfigurationSource configurationSource, InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, Nullable`1 isUnique, Nullable`1 isRequired, Nullable`1 deleteBehavior, Boolean runConventions)
   at Microsoft.Data.Entity.Metadata.Internal.InternalRelationshipBuilder.ForeignKey(IReadOnlyList`1 properties, ConfigurationSource configurationSource, Boolean runConventions)
   at Microsoft.Data.Entity.Metadata.Conventions.Internal.ForeignKeyPropertyDiscoveryConvention.Apply(InternalRelationshipBuilder relationshipBuilder)
   at Microsoft.Data.Entity.Metadata.Conventions.Internal.ConventionDispatcher.OnForeignKeyAdded(InternalRelationshipBuilder relationshipBuilder)
   at Microsoft.Data.Entity.Metadata.Internal.InternalEntityTypeBuilder.Relationship(InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, String navigationToPrincipalName, String navigationToDependentName, IReadOnlyList`1 dependentProperties, IReadOnlyList`1 principalProperties, ConfigurationSource configurationSource, Nullable`1 isUnique, Nullable`1 isRequired, Nullable`1 deleteBehavior, Boolean strictPrincipal, Func`2 onRelationshipAdding, Boolean runConventions)
   at Microsoft.Data.Entity.Metadata.Internal.InternalEntityTypeBuilder.Relationship(InternalEntityTypeBuilder principalEntityTypeBuilder, InternalEntityTypeBuilder dependentEntityTypeBuilder, String navigationToPrincipalName, String navigationToDependentName, ConfigurationSource configurationSource, Nullable`1 isUnique, Boolean strictPrincipal)
   at Microsoft.Data.Entity.Metadata.Internal.InternalEntityTypeBuilder.Relationship(InternalEntityTypeBuilder sourceBuilder, PropertyInfo navigationToTarget, PropertyInfo navigationToSource, ConfigurationSource configurationSource)
   at Microsoft.Data.Entity.Metadata.Conventions.Internal.RelationshipDiscoveryConvention.Apply(InternalEntityTypeBuilder entityTypeBuilder)
   at Microsoft.Data.Entity.Metadata.Conventions.Internal.ConventionDispatcher.OnEntityTypeAdded(InternalEntityTypeBuilder entityTypeBuilder)
   at Microsoft.Data.Entity.Metadata.Internal.MetadataDictionary`2.GetOrAdd(Func`1 getKey, Func`1 createKey, Func`2 createValue, Func`2 onNewKeyAdded, ConfigurationSource configurationSource)
   at Microsoft.Data.Entity.Metadata.Internal.InternalModelBuilder.Entity(Type type, ConfigurationSource configurationSource)
   at Microsoft.Data.Entity.ModelBuilder.Entity(Type type)
   at Microsoft.Data.Entity.Infrastructure.ModelSource.FindSets(ModelBuilder modelBuilder, DbContext context)
   at Microsoft.Data.Entity.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator)
   at Microsoft.Data.Entity.Internal.ThreadSafeDictionaryCache`2.GetOrAdd(TKey key, Func`2 factory)
   at Microsoft.Data.Entity.Internal.DbContextServices.CreateModel()
   at Microsoft.Data.Entity.Internal.LazyRef`1.get_Value()
   at Microsoft.Data.Entity.Internal.DbContextServices.get_Model()
   at lambda_method(Closure , ServiceProvider )
   at Microsoft.Framework.DependencyInjection.ServiceProviderExtensions.GetService[T](IServiceProvider provider)
   at lambda_method(Closure , ServiceProvider )
   at Microsoft.Framework.DependencyInjection.ServiceProviderExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
   at Microsoft.Framework.DependencyInjection.ServiceProviderExtensions.GetRequiredService[T](IServiceProvider provider)
   at Microsoft.Data.Entity.DbContext.EntryWithoutDetectChanges[TEntity](TEntity entity)
   at Microsoft.Data.Entity.DbContext.SetEntityState[TEntity](TEntity entity, EntityState entityState, GraphBehavior behavior)
   at Microsoft.Data.Entity.DbContext.Add[TEntity](TEntity entity, GraphBehavior behavior)
   at Intreba.Enm.Server.Repository.ServerStorage.AddStatusUpdate(StatusUpdate statusUpdate, Boolean save) in C:\Development\Enterprise Net2 Manager\Intreba.Enm.Server.Repository\ServerStorage.cs:line 78
   at Intreba.Enm.Server.Repository.ServerStorage.AddStatusUpdate(StatusUpdate statusUpdate) in C:\Development\Enterprise Net2 Manager\Intreba.Enm.Server.Repository\ServerStorage.cs:line 73
   at Intreba.Enm.Server.Client.AliveHandler.Handle(Heartbeat message) in C:\Development\Enterprise Net2 Manager\Intreba.Enm.Server.Client\AliveHandler.cs:line 54
   at NServiceBus.Unicast.MessageHandlerRegistry.Invoke(Object handler, Object message, Dictionary`2 dictionary) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\MessageHandlerRegistry.cs:line 124
   at NServiceBus.InvokeHandlersBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Behaviors\InvokeHandlersBehavior.cs:line 23
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.SetCurrentMessageBeingHandledBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Behaviors\SetCurrentMessageBeingHandledBehavior.cs:line 17
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.LoadHandlersBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Behaviors\LoadHandlersBehavior.cs:line 45
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.ExecuteLogicalMessagesBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Messages\ExecuteLogicalMessagesBehavior.cs:line 24
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.UnitOfWorkBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\UnitOfWork\UnitOfWorkBehavior.cs:line 42
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.Transports.RabbitMQ.OpenPublishChannelBehavior.Invoke(IncomingContext context, Action next) in c:\BuildAgent\work\ef98ad7376e3379a\src\NServiceBus.RabbitMQ\OpenPublishChannelBehavior.cs:line 19
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.ChildContainerBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Behaviors\ChildContainerBehavior.cs:line 17
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.<>c__DisplayClass4_0.<InvokeNext>b__0() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 95
   at NServiceBus.ProcessingStatisticsBehavior.Invoke(IncomingContext context, Action next) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Monitoring\ProcessingStatisticsBehavior.cs:line 23
   at NServiceBus.BehaviorChain`1.InvokeNext(T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 107
   at NServiceBus.BehaviorChain`1.Invoke() in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\BehaviorChain.cs:line 52
   at NServiceBus.Pipeline.PipelineExecutor.Execute[T](BehaviorChain`1 pipelineAction, T context) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Pipeline\PipelineExecutor.cs:line 129
   at NServiceBus.Unicast.Transport.TransportReceiver.OnTransportMessageReceived(TransportMessage msg) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs:line 413
   at NServiceBus.Unicast.Transport.TransportReceiver.ProcessMessage(TransportMessage message) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs:line 344
   at NServiceBus.Unicast.Transport.TransportReceiver.TryProcess(TransportMessage message) in C:\BuildAgent\work\3206e2123f54fce4\src\NServiceBus.Core\Unicast\Transport\TransportReceiver.cs:line 230
   at NServiceBus.Transports.RabbitMQ.RabbitMqDequeueStrategy.ConsumeMessages(Object state) in c:\BuildAgent\work\ef98ad7376e3379a\src\NServiceBus.RabbitMQ\RabbitMqDequeueStrategy.cs:line 193

person janpieter_z    schedule 05.11.2015    source источник
comment
Исключение происходит при создании модели. Кажется, что-то не так с отображением. Можете ли вы опубликовать конфигурацию сопоставления EF?   -  person Francesc Castells    schedule 05.11.2015
comment
@FrancescCastells Я добавил переопределение OnModelCreating (если это то, что вы ищете), а также два других объекта, у которых есть внешний ключ, для объекта Client. Обратите внимание, что это не тот объект, который я добавляю в этот момент, я добавляю StatusUpdate (который действительно имеет отношение к Client).   -  person janpieter_z    schedule 05.11.2015
comment
Да, это то, что я имел в виду. EF даже не пытается добавить StatusUpdate. При первом использовании контекста EF создает внутреннее представление структуры модели. Мне кажется, что он не может правильно понять, как обрабатывать каскадное удаление в одном из отношений. Я бы посоветовал вам полностью указать отношения между всеми сущностями, такими как modelBuilder.Entity‹AccessLevel›().HasRequired(a=›a.Client).WithMany().HasForeignKey(a=›a.ClientId)willCascadeDelete(false) ;   -  person Francesc Castells    schedule 05.11.2015
comment
Пф, это займет некоторое время. Я доложу. Любая идея, почему это будет только на одной машине?   -  person janpieter_z    schedule 05.11.2015
comment
Честно говоря, я не знаю. Боюсь, я не могу заверить вас, что то, что я предлагаю, тоже сработает, но все, что вы не отображаете явно, угадывается EF в соответствии с некоторыми соглашениями, и по опыту получающееся отображение не всегда то, что вы ожидаете, поэтому я всегда указать все отношения явно.   -  person Francesc Castells    schedule 05.11.2015
comment
Это, похоже, не решило эту проблему. Локально вставки продолжали работать, чтение с веб-сервера продолжало работать, но на том же сервере появилась та же ошибка.   -  person janpieter_z    schedule 05.11.2015
comment
Кажется, мы обходим это, запуская приложение в режиме x86 вместо x64. В любом случае у нас та же проблема.   -  person Max    schedule 05.11.2015
comment
Может ли это быть ошибкой EF? Я нашел это, которое произошло только на x64 github.com/aspnet/EntityFramework/issues/2451< /а>   -  person Francesc Castells    schedule 05.11.2015
comment
Я только что решил эту проблему, без шуток, установив 7 рекомендованных, и я не знаю, сколько дополнительных обновлений было на этой машине. Почему, я понятия не имею, но, может быть, вы можете подтвердить это, @Max? В противном случае я бы предложил самостоятельно поднять вопрос в Entity Framework (вы можете сослаться на этот пост). Поскольку это теперь решено, я отмечу это как решенное.   -  person janpieter_z    schedule 05.11.2015


Ответы (1)


Решением для меня было обновить сервер и установить все рекомендуемые и необязательные обновления Windows.

person janpieter_z    schedule 05.11.2015