gpt4 book ai didi

fluent-nhibernate - 如何在 nhibernate 中映射接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 07:41:36 24 4
gpt4 key购买 nike

我正在使用两个类NiceCustomer & RoughCustomer实现接口(interface)ICustomer .
ICustomer有四个属性。他们是:

  • Property Id() As Integer
  • Property Name() As String
  • Property IsNiceCustomer() As Boolean
  • ReadOnly Property AddressFullText() As String

  • 不知道怎么映射界面 ICustomer , 到数据库。

    我在内部异常中收到这样的错误。

    An association refers to an unmapped class: ICustomer



    我正在使用 Fluent 和 NHibernate。

    最佳答案

    可以通过在配置阶段插入 EmptyInterceptor 直接映射到 NHibernate 中的接口(interface)。这个拦截器的工作是为您在映射文件中定义的接口(interface)提供实现。

    public class ProxyInterceptor : EmptyInterceptor
    {
    public ProxyInterceptor(ITypeHandler typeHandler) {
    // TypeHandler is a custom class that defines all Interface/Poco relationships
    // Should be written to match your system
    }

    // Swaps Interfaces for Implementations
    public override object Instantiate(string clazz, EntityMode entityMode, object id)
    {
    var handler = TypeHandler.GetByInterface(clazz);
    if (handler == null || !handler.Interface.IsInterface) return base.Instantiate(clazz, entityMode, id);
    var poco = handler.Poco;
    if (poco == null) return base.Instantiate(clazz, entityMode, id);

    // Return Poco for Interface
    var instance = FormatterServices.GetUninitializedObject(poco);
    SessionFactory.GetClassMetadata(clazz).SetIdentifier(instance, id, entityMode);

    return instance;
    }

    }

    在此之后,所有的关系和映射都可以定义为接口(interface)。
    public Parent : IParent {
    public int ID { get; set; }
    public string Name { get; set; }
    public IChild Child { get; set; }
    }

    public Child : IChild {
    public int ID { get; set; }
    public string Name { get; set; }
    }

    public class ParentMap : ClassMap<IParent>
    {
    public ParentMap()
    {
    Id(x => x.ID).GeneratedBy.Identity().UnsavedValue(0);
    Map(x => x.Name)
    }
    }

    ...

    如果您想实现 ORM 的真正解耦,将所有配置/映射放在单独的项目中并且仅引用接口(interface),这种类型的技术非常有用。然后,您的域层不会被 ORM 污染,如果需要,您可以在稍后阶段替换它。

    关于fluent-nhibernate - 如何在 nhibernate 中映射接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286691/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com