有一个名为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图,它应该是这样的。
答案 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映射整个对象。