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

Using interfaces with Entity Framework in right way

有一个名为 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 应用程序,只是一个知道如何通过存储库面将对象保存到数据库的库)。所以我正在为它实现具体的 classes:

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(这些都是接口)所以我不能将此 class 用于 Entity Framework,因为 EF 需要具体的 classes 将它们保存在数据库中(它需要导航属性)。

所以我的问题是: 我如何设计我的架构,以便我可以在应用程序(Web、桌面)中使用接口,并且仍然能够使用 Entity Framework 作为 ORM?我不想因为 Entity Framework.

而改变我所有的接口

这是非常简化的 UML 图,它应该是什么样子。

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

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

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

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

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; }
    }

}

所以现在我可以通过使用未映射的属性在代码中使用权限 属性,并且仍然让 EF 映射整个对象。