我正在使用的团队已经完成了将MVC 4应用程序从使用FluentNHibernate转换为使用Entity Framework 5的任务。
该项目正在使用StructureMap进行依赖注入。目前国际奥委会看起来像这样:
ForSingletonOf<ISessionFactory>().Use(SessionConfiguration.get_session_factory);
For<ISession>()
.HttpContextScoped()
.Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession())
.EnrichWith((ISession session) => new TransactionManagementSessionDecorator(session));
该项目包含一些Object Extensions,其中一个如下:
public static bool is_instance_of<T>(this object instance)
{
if (instance is INHibernateProxy)
return ObjectFactory.GetInstance<ISession>().GetSessionImplementation().PersistenceContext.Unproxy(instance) is T;
return instance is T;
}
以上扩展名将用于例如:
CartItemType get_cart_item_type(Registration registration)
{
if (registration.is_instance_of<FirstTimeRegistration>())
return CartItemType.FirstTime;
if (registration.is_instance_of<ReplacementRegistration>())
return CartItemType.Replacement;
if (registration.is_instance_of<RenewalRegistration>())
return CartItemType.Renewal;
...
...
throw new ArgumentException("Registration Type is unknown");
}
类FirstTimeRegistration,ReplacementRegistration和RenewalRegistration都继承了Registration类。
以下内容已添加到我们的IOC以转换为EF:
For<RegistrationContext>()
.HttpContextScoped()
.Use(x => new RegistrationContext());
For(typeof(IEFRepository<>)).Use(typeof(EFRepository<>));
我似乎遇到的问题是弄清楚如何更改is_instance_of&lt;&gt;扩展与Entity Framework一起使用?
答案 0 :(得分:1)
这里只是从臀部拍摄(我对NHibernate知之甚少),如何使用框架(ref msdn)中的Type.IsInstanceOfType()?
所以你的代码看起来像
CartItemType get_cart_item_type(Registration registration)
{
if (typeof(FirstTimeRegistration).IsInstanceOfType(registration))
return CartItemType.FirstTime;
if (typeof(ReplacementRegistration).IsInstanceOfType(registration))
return CartItemType.Replacement;
if (typeof(RenewalRegistration).IsInstanceOfType(registration))
return CartItemType.Renewal;
...
...
throw new ArgumentException("Registration Type is unknown");
}
表达看起来略微倒退,但是......
答案 1 :(得分:1)
你可能在这里遇到麻烦。 NHibernate支持很多实体框架5(甚至6)不支持的东西。我也很惊讶,但经过一些research,我很确定你的任务是不可能完成的。