gpt4 book ai didi

c# - 映射接口(interface)或抽象类组件

转载 作者:太空狗 更新时间:2023-10-30 01:11:56 25 4
gpt4 key购买 nike

请考虑以下简单用例:

public class Foo 
{
public virtual int Id { get; protected set; }
public virtual IBar Bar { get; set; }
}

public interface IBar
{
string Text { get; set; }
}

public class Bar : IBar
{
public virtual string Text { get; set; }
}

还有 fluent-nhibernate 映射类:

public class FooMap : ClassMap<Foo> 
{
public FooMap()
{
Id(x => x.Id);
Component(x => x.Bar, m =>
{
m.Map(x => x.Text);
});
}
}

在使用配置运行任何查询时,出现以下异常:

NHibernate.InstantiationException: "Cannot instantiate abstract class or interface: NHMappingTest.IBar"

NHibernate 似乎试图实例化一个 IBar对象而不是 Bar具体类。属性返回接口(interface)或抽象基类时,如何让Fluent-NHibernate知道实例化哪个具体类?

编辑:通过编写 Component<Bar> 明确指定组件的类型(如 Sly 所建议的那样)没有效果并导致发生相同的异常。

EDIT2:感谢 vedklyv 和 Paul Batum:这样的映射应该很快现在是可能的。

最佳答案

我自己还没有尝试过,但我在 fluent nh 源代码中看到了一个示例,其中 lambda 被转换为具体类:

public class FooMap : ClassMap<Foo> 
{
public FooMap()
{
Id(x => x.Id);
Component(x => (Bar) x.Bar, m =>
{
m.Map(x => x.Text);
});
}
}

编辑:显然这与 Sly 的建议完全相同,因此没有任何好处。我针对 fluent nh 的主干版本对其进行了测试,但没有用。如果您使用多对一映射,它确实有效:

  public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Id(x => x.Id);
References<Bar>(x => x.Bar).Cascade.All();
}
}

public class BarMap : ClassMap<Bar>
{
public BarMap()
{
Id(x => x.Id);
Map(x => x.Text);
}
}

更新

这实际上是一个简单的修复。我已经提交了一个补丁 ( link text ),它使 Sly 的解决方案起作用。

关于c# - 映射接口(interface)或抽象类组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1548839/

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