与接口一起使用的最佳OR / M.

时间:2013-02-11 16:31:09

标签: c# entity-framework nhibernate orm llblgenpro

在我们的下一个项目中,我们需要使用这样的接口(示例代码)

public interface IFoo
{
    string Name {get; set;}
    IList<IBar> Bars {get; set;}
}

public interface IBar
{
    string Name {get;set;}
    IList<IFoo> Foos {get;set;
}


public class Foo : IFoo
{
    public string Name {get; set;}
    public IList<IBar> Bars {get; set;}
}

public class Bar : IBar
{
    public string Name {get; set;}
    public IList<IFoo> Foos {get;set;}
}

显然,在应用程序层,我们希望使用这些接口,而且对实现类没有任何了解。

我一直在看几个OR / M - 我们目前拥有LLBLGen,我已经尝试过EntityFramework,这是一个噩梦,也没有让它工作,看着NHibernate,但事实上是开始程序是如此复杂,相对于LLBLGen吓坏了我(但我仍然对NHibernate开放,如果它支持我的需要)。

所以,我正在寻找:一个简单的OR / M,我可以使用最小的设置要求(LLBLGen你只需使用他们的工具来反向工程你的数据库,生成源代码,你就可以开始编码),支持上面的结构。

旁注:有谁能告诉我我要找的模式是什么? (除了超级懒惰;))

2 个答案:

答案 0 :(得分:1)

// mappings
public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(f => f.Name);
        HasMany(f => f.Bars).KeyColumn("foo_Id");
    }
}

public class BarMap : ClassMap<Bar>
{
    public BarMap()
    {
        Map(f => f.Name);
    }
}

// query
var john = session.Query<IFoo>()
    .Where(f => f.Name == "John")
    .Fetch(f => f.Bars)
    .Single();

Console.Writeline(john.Bars.Count);

答案 1 :(得分:0)

LLBLGen Pro v3.x可以为您生成实体类的接口(您可以使用宏指定名称,并在项目级别定义它,因此它根本不起作用),并且使用简单的模板,你也可以生成接口。

但是,您是否在多个实体上重用接口?在这种情况下,您可能希望通过接口进行查询,并获取实现该接口的所有类型的所有实例。并非所有ORM都支持(我认为NHibernate会支持,我们自己的运行时和EF不支持)