以正确的方式使用 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 映射整个对象。
有一个名为 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 映射整个对象。