如何从UI中分离EF对象

时间:2015-11-27 17:25:32

标签: c# entity-framework interface

我有一个N层应用,UI,BLL和DAL。我的DAL使用EF6进行所有数据库交互。

这意味着,如果我查询数据库然后想要在我的UI中迭代对象(例如foreach循环以在屏幕上显示值),我的UI必须知道DAL。这似乎不正确。我希望我的DAL什么都不知道。 Bll可以知道DAL。用户界面只能知道BLL。

请考虑这个简化的EF对象

partial class Foo 
{
    public int Id { get; set; }
    public virtual ICollection<Bar> FooFoo { get; set; }
}

我能想到的唯一方法是,如果我还有一个映射2个对象的Bll.Foo。然后我想,如果它们都实现了IFoo接口,那可能会更好。但是Foo有一个Bar of Collection,它也需要是IBar类型。这就是出错的地方。请考虑:

class Foo : IFoo                                          //generated by EF
{
    public int Id { get; set; }                           //generated by EF
    public virtual ICollection<Bar> FooFoo { get; set; }  //generated by EF and KABOOM
}

interface IFoo
{
    ICollection<IBar> FooFoo { get; set; }   
}

class Bar : IBar
{
    public int MyPr
    { get; set; }
}

interface IBar
{
    int MyPr { get; set; }
}

与上述干,我已经示出的KABOOM问题,是接口没有“满意”,因为它通过EF正值类型Bar,但接口说我需要实现其作为型{ {1}}。没有这个,我不会脱钩......

我怎样才能实现这个目标,或者我的理解存在缺陷?

1 个答案:

答案 0 :(得分:0)

关于创建模型和映射2的想法是将UI与DAL中的实体分开进行分离的合理方法。 你的BLL将有一个BLL.Foo来映射这两个对象。 你的BLL暴露BLL.Foo,以便它们可以被它上面的层使用。 这样只有BLL知道DAL实体。