我想使用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迁移仅在完全信任中工作?
答案 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)