从NHibernate转换为实体框架检查实例的类型

时间:2013-03-06 19:58:36

标签: entity-framework fluent-nhibernate structuremap

我正在使用的团队已经完成了将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一起使用?

2 个答案:

答案 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,我很确定你的任务是不可能完成的。