【问题标题】:Best OR/M for use with Interfaces与接口一起使用的最佳 OR/M
【发布时间】:2013-02-11 16:31:09
【问题描述】:

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

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

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

【问题讨论】:

  • 实体框架远非噩梦。但是,我不知道您尝试了哪种方法,因为基本上有两种方法:代码优先和模型优先。如果您采用模型优先,您可以自定义用于生成实体的 T4 模板以生成任何代码(在您的情况下,这些接口也是如此)
  • @HighCore 看看这个:stackoverflow.com/questions/14631309/… - 我花了 4 天时间才让它工作。使用 LLBLGen,我可以调用 adapter.Save(myEntity);一切都会开箱即用。我首先将 DB 与 EF 一起使用。
  • 再一次,我不知道你在用什么。我们将 Entity Framework 4.0 与 STE 模板一起用于客户端/服务器应用程序。它工作得很好,没有你在那里描述的问题。
  • context.ApplyChanges()context.SaveChanges() 是将整个对象图保存到实体框架中的数据库所需的全部内容。我不知道附加的所有东西是什么。如果您是 db.ApplyChanges(account),那么 SaveChanges() 它会保存帐户及其所有地址、电话和任何相关实体。
  • @HighCore 如果可行,他们为什么要删除 STE?我相信我用过 EF 5 或 6

标签: c# entity-framework nhibernate orm llblgenpro


【解决方案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);

【讨论】:

  • 使用HasManyToMany(f =&gt; f.Bars).Table("LinkTable").ParentKeyColumn("foo_Id").ChildKeyColumn("bar_id");
  • 我得到了这个工作,除了每当我尝试它时,我的数据库表不断被删除和重新创建。显然这不是因为你的代码,对吧?
  • 不。配置中是否有 SchemaExport 使用或 autoddl = true ?
  • 是的,它是 Helper 中的 .Create 东西。这实际上有效,我很惊讶它是多么简单!我还没有尝试使用接口,请给我几分钟,我会报告。
  • 我不能用接口做这个... :/
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2015-05-27
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多