1

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

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,你只需使用他们的工具对你的数据库进行逆向工程,生成源代码,然后你就可以开始编码了),它支持结构以上。

附带说明:谁能告诉我我正在寻找的模式叫什么?(除了超懒惰的;))

4

2 回答 2

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);
于 2013-02-11T19:30:59.783 回答
0

LLBLGen Pro v3.x 可以为你生成实体类上的接口(你可以用宏指定名称,在项目级别定义,根本没用),用简单的模板就可以生成接口也是如此。

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

于 2013-02-14T16:24:18.167 回答