实体框架4.3迁移和中等信任

时间:2012-03-31 10:41:44

标签: entity-framework ef-migrations

我想使用EF的新迁移功能,但是当我模拟在web.config文件中添加“trust level = Medium”的中等信任环境时,在我的本地计算机上,我收到此安全异常:

   System.Reflection.RuntimeMethodInfo.GetMethodBody() +24
   System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext) +1031
   System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration) +66
   System.Data.Entity.MigrateDatabaseToLatestVersion`2.InitializeDatabase(TContext context) +52
   System.Data.Entity.<>c__DisplayClass2`1.<SetInitializerInternal>b__0(DbContext c) +75
   System.Data.Entity.Internal.<>c__DisplayClass8.<PerformDatabaseInitialization>b__6() +19
   System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) +72
   System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() +185
   System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) +7
   System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input) +118
   System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action) +190
   System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() +73
   System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +28
   System.Data.Entity.Internal.Linq.InternalSet`1.Initialize() +57
   System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext() +15
   System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider() +37
   System.Linq.Queryable.Where(IQueryable`1 source, Expression`1 predicate) +63

EF迁移仅在完全信任中工作?

3 个答案:

答案 0 :(得分:2)

第一个EF migrations CTP提到了完全信任限制,并注意到它可以在将来的版本中解决,但未来的版本没有提到这个限制是固定的,所以它很可能仍然存在。

答案 1 :(得分:2)

您的考虑: 我刚刚发现EF和中等信任环境的问题是什么。

在阅读this article并进行一些代码修订后,我发现我的一个EF模型类聚合了另一个具有私有属性的类。看起来EF试图加载那些在中等信任环境中不允许的属性。从我的模型类中删除此引用(我现在复制所需的属性)解决了导致ReflectionPermission异常的问题。

如果这无济于事,还有一些人认为它有助于他们。 在模型文件的初始化或AssemblyInfo.cs中添加此属性:

[assembly:AllowPartiallyTrustedCallers]

详细了解it here

答案 2 :(得分:0)

您可以在System.Data.Entity.Migrations.DBMigrator类构造函数中替换以下代码:

if (method != null)
{
    this._hasSeedLogic = method.GetMethodBody().GetILAsByteArray().Length > 2;
}

为:

if (method != null)
{
    this._hasSeedLogic = true;
}

使用Reflector和Reflexil插件。在此hack之后,它将在中等信任环境中工作。

如果您信任我,可以从here下载修补后的dll(EF 5.0 beta 2)