以正确的方式使用与Entity Framework的接口

时间:2015-03-18 16:06:17

标签: c# entity-framework architecture

有一个名为DbContract的DLL,除其他外,包含这些接口(代码主要是波兰语):

public interface IKategoria
{
  string Nazwa { get; set; }
  IGrupa Grupa { get; set; } 
  ICollection<IKategoriaUzytkownik> Uzytkownicy { get; set; }
  ICollection<IZdarzenie> Zdarzenia { get; set; }
}

然后我想在另一个DLL中使用Entity Framework存储库(它不是一个Web应用程序,只是一个知道如何通过存储库的facede将对象保存到数据库的库)。所以我正在为它实现具体的类:

public class Kategoria : BaseObject, IKategoria
{
    private string _Nazwa; 
    private IGrupa _Grupa; 
    private ICollection<IKategoriaUzytkownik> _Uzytkownicy;
    private ICollection<IZdarzenie> _zdarzenia;

    public string Nazwa
    {
        get { return _Nazwa; }
        set { _Nazwa = value; }
    public Guid GrupaId { get; set; }
    public virtual IGrupa Grupa
    {
        get { return _Grupa; }
        set { _Grupa = value; }
    }
    public virtual ICollection<IKategoriaUzytkownik> Uzytkownicy
    {
        get { return _Uzytkownicy; }
        set { _Uzytkownicy = value; }
    }


    public virtual ICollection<IZdarzenie> Zdarzenia
    {
        get { return _zdarzenia; }
        set { _zdarzenia = value; }
    }

}

因为你可以看到我需要使用IKategoria,IKategoriaUzytkownicy或IZdarzenie(这些都是接口)所以我不能将这个类用于Entity Framework,因为EF需要具体的类来将它们保存在DB中(它需要导航属性)

所以我的问题是: 我如何设计我的架构,以便在应用程序(Web,桌面)中使用接口,并且仍然可以将实体框架用作ORM?我不想因为Entity Framework而弯曲我的所有接口。

这是一个非常简化的UML图,它应该是这样的。How it should be

2 个答案:

答案 0 :(得分:1)

类型转换节省了艰苦的工作。 Repository.Save((Kategoria)IKategoria);

如果不喜欢类型转换或者不那么简单,首先将该接口转换为类然后保存它。请注意,我早就忘记了EF语法。

public void Save(IKategoria iKategoria){
    Kategoria kategoria = new IKategoriaToKategoriaConverter().Convert(iKategoria);
    Repository.Save(kategoria);
}

答案 1 :(得分:0)

最后我最终得到了这个解决方案:

public partial class GrupaEF : BaseObjectEF
{


    private ICollection<KategoriaEF> _Kategorie;
    private ICollection<UzytkownikGrupaEF> _Uzytkownicy;


    public virtual ICollection<KategoriaEF> KategorieEF
    {
        get { return _Kategorie; }
        set { _Kategorie = value; }
    }
    public virtual ICollection<UzytkownikGrupaEF> UzytkownicyEF
    {
        get { return _Uzytkownicy; }
        set { _Uzytkownicy = value; }
    }


}

另一个档案:

 public partial class GrupaEF : IGrupa
{

    public string Nazwa
    {
        get
        {
            return this.Nazwa;
        }
        set
        {
            this.Nazwa = value;

        }
    }

    public string Opis
    {
        get { return Opis; }
        set { Opis = value; }
    }
    [NotMapped]
    public ICollection<IKategoria> Kategorie
    {
        get
        {
            return (ICollection<IKategoria>)this.KategorieEF;
        }
        set { KategorieEF = (ICollection<KategoriaEF>)value; }
    }
    [NotMapped]
    public ICollection<IUzytkownikGrupa> Uzytkownicy
    {
        get { return (ICollection<IUzytkownikGrupa>)this.UzytkownicyEF; }
        set { UzytkownicyEF = (ICollection<UzytkownikGrupaEF>)value; }
    }

}

所以现在我可以使用非映射属性在代码中使用right属性,并且仍然让EF映射整个对象。