Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Multiple DbContext, Multiple Projects, Single database

[es] :: .NET :: Multiple DbContext, Multiple Projects, Single database

[ Pregleda: 2550 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Multiple DbContext, Multiple Projects, Single database21.11.2016. u 10:40 - pre 89 meseci
Postavka je ovakva: imam 4 projekta, A, B, C i D. B i C referenciraju A, D referencira sve ostale.
A je mala class lib. koja definise asp.net identity user/role/... klase (ms je default napravio sa stringom kao key-em pa sam hteo da napravim sa int-om i da imam u posebnom dll-u, da ne radim svaki put).
E sad, projekat B je class lib koji definise nove entity-e i DbContext. Medjutim, on mora da prosiri User-a novim kolonama i kolekcijama entiteta (tipa, kolekcijom dokumenata kojima je autor).
Projekat C je isti sistem kao B, samo se bavi drugim stvarima.

Projekat D je aplikacija koja koristi biblioteke B i C i koja ce takodje imati svoje entity objekte i DbContext.

Problem je kako zadovoljiti sve potrebe za User entity-a. UserB i UserC (iz B i C projekta) mogu nasledtiti UserA, ali UserD ne moze u isto vreme naslediti UserB i UserD.
Idealno bi bilo ako bih mogao da koristim samo jedan DbContext sa jednom grupom entity-a.
Resenje koje bih da izbegnem je da imam konverzije iz UserD u UserA/B/C i nazad i koriscenje 4 DbContext-a (teoretski, pored B i C moze paralelno biti i vise projekata).
 
Odgovor na temu

dejanet
Beograd

Član broj: 19240
Poruke: 1181



+835 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 12:30 - pre 89 meseci
Ako je u pitanju jedna db, zasto ne bi uradio klasicnu varijantu: jedan DAL project sa EF modelom, zatim u drugom layer-u service projekte koji rade sa data(linq to..), pa spustis na kontroler(mvc, web api) ili code behind(web forms). Izmedju mozes da ubacis i neki presentation layer ako ti treba.
Sto se Asp.net Identity-ija, ima use-case kada koristis njegovu implementaciju(HttpContext.Current.User.Identity.xxxx... itd) ili cesto u konjukciji sa query-ijima nad users/roles koje dodajes u DAL layer.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 13:35 - pre 89 meseci
Stvar je u tome da projekti B i C imaju svoj DAL i BL layer i trebali bi biti medjusobno nezavisni, kao i nezavisni od D-a.

Evo primera:
Imas class library koji je neki jednostavan document management system i imas class library koji je, lupam, webshop (samo BL i DAL, bez prezentacionog dela). Oba su napraljvenja kao reusable komponente i nisu svesne gde ce se koristiti.
I sad hoces npr. da napravis CMS koji koristi dms i web shop. CMS ce definisati interfejs, ali funkcionalnost koristi iz tih modula.
Iako ja pravim svaki od tih projekata, zeleo bih da ne uvodim zavisnosti koje nisu potrebne.
Takodje, ne zelim da koristim projekte u okviru solution-a vec samo da referenciram dll-ove (da budem precizniji, nameravam da napravim lokalni NuGet repository).
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 14:19 - pre 89 meseci
Možda bi kod UserD mogao da koristiš kompoziciju UserB i UserC umesto nasleđivanja?
Ili da npr. UserD naslediš od UserA a B i C expose-uješ kroz property-je asUserB, asUserC?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 14:19 - pre 89 meseci
Hmmm, to ces tesko da uradis jer, ako sam dobro shvatio ti hoces da B i C imaju razlicita dopunska polja u istoj semi da bi mogao da ih koristis kroz isti kontekst. Ja mislim da to jednostavno nije moguce bez da imas trecu nad-semu, cime gubis nezavisnost izmedju B i C. A onda u pricu tek ulazi D sa svojim prosirenjem.

U nekom non-EF scenariju za multiple inheritance bi mogao da koristis interfejse i enkapsulaciju, tako da bi ID mogao da se ponasa kao IB i IC, ali ovde ne vidim resenje jer ti moras da spojis i implementacije, ne samo contracte.

Mislim da je resenje koje pokusavas da izbegnes jedino, a pride nije ni jednostavno ako radis sa konverzijom attached entiteta. Ti si realno jedini svestan na D nivou da su UserB i UserC ista osoba, i D projekat ti je vec zavistan od B i C, tako da ne vidim neki veci prezentacioni problem da napravis konvertore izmedju ta dva tipa (ekstenzija, npr http://stackoverflow.com/quest...on-method-and-explicit-casting) i da onda castujes kroz njih na mestu upotrebe. Ali cetiri konteksta ti ne gine i limitiran si apsolutno koriscenjem detached entiteta, jer nema sanse da lahko preneses kroz konvertor entitet iz jednog u drugi kontekst.

@dusans, kompozija bi ga opet primoravala da dva puta ucita istog usera iz dva konteksta da bi instancirao kompozit.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 15:37 - pre 89 meseci
Hm, sad mi je nesto palo na pamet. Mozda u B i C mogu da definisem samo interfejs DbContext-a a da onda u D-u napravim implementaciju i inject-ujem je. Mogu eventualno u B i C napraviti neku default implementaciju ako treba.

Nesto ovako:
Code (csharp):

  interface IUserB { int ID { get; set; } string Username { get; set; } }
  interface IDbContextB<TUser> where TUser : class, IUserB
  {
    DbSet<TUser> Users { get; set; }
  }

  interface IUserC { int ID { get; set; } string Username { get; set; } string Email { get; set; } }
  interface IDbContextC<TUser> where TUser : class, IUserC
  {
    DbSet<TUser> Users { get; set; }
  }

  class UserD : IUserB, IUserC
  {
    public int ID { get; set; }
    public string Username { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
  }
  class DbContextD : IDbContextB<UserD>, IDbContextC<UserD>
  {
    public DbSet<UserD> Users { get; set; }
  }
 

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 16:34 - pre 89 meseci
ovde mi nesto ne stima Iako se verovanto kompajlira, ovo je samo skelet, kako bi instancirao sve ovo? I kako bi ga povezao sa EF.NETom?

ako pozoves new DbContextD(), sta dobijes? Koji context bi ti ucitao UsersD? I kako bi povezao UsersB i IUsersB (I/UsersC), tj kako bi povezao DBContext sa tvoj IDBcontext-ima?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.dynamic.isp.telekom.rs.



+171 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 16:55 - pre 89 meseci
Ja sam zbog ovakvih stvari digao ruke od same podrske jezika i napravio neki svoj mini FW (svega par klasa). No, mana je sto sada svi objekti koje zelim negde da prosirim moraju imati nasledjen dodatno interfejs za prosirivanje klase. Meni ne samo da je bitna nezavisnot izmedju projekata nego mi je bitno i da referenca ostaje ista, tipa da nema prepakivanja kroz copy konstruktor da sam recimo radio kroz nasledjivanje (prvo zbog performansi, drugo, sto mi skida glavoblju kod bindinga). Naravno pored svega bitno mi je da je i type safe :)

Ovo je ukratko usage:

Code:

Project A

public class A
{
    public string Name {get; }
}

--------------------------------------------------------------------
Project B

public class A_BExtension
{
    A_BExtension(A a)
   {
        _a = a;
   }

    A _a = a;
    public string Description
}


Zatim definisem extension metodu (GetEx he u stvari deo tog API-a):

Code:

public static A_BExtension B(this A a)
    => node.GetEx(() => new A_BExtension(a));


pa zatim kada koristim:

Code:

A a = new A();

// do whatever...
a.B().Description


E sad, ovo je daleko od idealnog, meni je bila potrebna fleksibilnost, pa sam pribegao ovom pristupu, posto kao sto rekoh, veoma mi je bitno da referenca ostaje ista (DI mi ne pije vodu, pomalo rigidan, a drugo, trudim se sto vise da su mi klase immutable, pa samim tim svi paramteri ulaze kroz konstruktor).

 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 17:26 - pre 89 meseci
OK, ovde sam zaboravio dve stvari. Jedna je class DbContextD : DbContext, IDbContextB<UserD>, IDbContextC<UserD> a druga je forsiram da implementacija IDbContextB i IDbContextC mora da nasledjuje DbContext. E to drugo je vec nezgodno, jer ne moze direktno. Na zalost, interface ne moze da nasledi klasu kao sto moze drugi interfejs (za sta ne vidim dobar razlog, svaka klasa ima svoj interejs).

Sto se tice toga kako da povezem sve, napravim repository koji radi sa IDbContextB u B-u i IDbContextC u C-u a iz D dam konkretnu instancu. Npr:

Code (csharp):

public class RepositoryB
{
    private IDbContextB Context { get; set; }

    public RepositoryB (IDbContextB context)
    {
        Context = context;
    }

    public GetUserByID(int id)
    {
         return Context.Users.FirstOrDefault(u => u.ID == id);
    }
}
 


Ali, kao sto rekoh, ovde ne uspevam da primoram onog ko koristi komponentu da konstruktoru prosledi klasu koja nasledjuje DbContext.
Osim mozda putem generika:
Code (csharp):

public class RepositoryB<T> where T : DbContext, IDbContextB
{
    public RepositoryB(T context) { ... }
}
 

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 17:36 - pre 89 meseci
Cekaj, kako ti definises modele? code first?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: Multiple DbContext, Multiple Projects, Single database21.11.2016. u 17:40 - pre 89 meseci
Code first
 
Odgovor na temu

[es] :: .NET :: Multiple DbContext, Multiple Projects, Single database

[ Pregleda: 2550 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.