Diskuze: Vložení dat do databáze pomocí EF
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
skús tam neposielať ten User object, jednoducho tam pošli null. Možno by bolo fajn tu hodiť aj jednotlivé kódy týchto entít. a service ak tak.
Děkuju za odpověď. Ale musím říct, že mi příliš nepomohla přesně todle jsem totiž napsal já. Že vím že se to dá udělat že tam ten obejkt vůbec nepošlu a vlastně naplním to ostatní ale já se ptám zda se nějak nedá udělat to že tam pošlu všechno a ono to samo pozná že ten obejtk nechce.
bez kódu veľa vody nenamútime. Riešenie je použiť 2 contexty. Z jedného vytiahnuť Usera a do druhého zapísať UserPhoto. Lenže nemáme veľmi odkiaľ vedieť, čo sa tam vlastne deje.
mít více DBContextu - obzvláště při jedné logické transakci je
naprosto fantastický způsob, jak si nasr*t do bot
Ano to vím no že mít více DBContextu by se nemělo úplně dělat a to také dodržuji. A bez kódu myslel jsem, že je to jasné kód by mohl vypadat následovně:
var newUserPhoto = new UserPhoto() {
Name = "Photo2",
Document = "photo.jpg",
User = .... (Objekt uživatele)
User_ID = (Objekt uživatele).ID
};
//Co bych chtěl
_userPhotoService.UserPhotos.Add(newUserPhoto);
//Co musím udělat
_userPhotoService.UserPhotos.Add(new UserPhoto() {
Name = newUserPhoto.Name,
Document = newUserPhoto.Document,
User_ID = newUserPhoto.ID,
//User = newUserPhoto - todle právě nejde udělat proto nemůžu použít to co chci.
});
Stačí todle jako příklad ? Když použiju to co bych chtěl vyhodí to tuto hlášku: An entity object cannot be referenced by multiple instances of IEntityChangeTracker
public class DatabaseContext : DbContext
{
public DbSet<Work> Works { get; set; }
public DbSet<WorkDay> WorkDays { get; set; }
public DbSet<Log> Logs { get; set; }
public DatabaseContext() : base("WorkContext")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
2. User mi vzniká v oknu kde si vyplňuju uživatelovo jmeno a dokument pak je prave poslan ten newUserPhoto to je ten objekt. Napsal jsem to tkhle rychle jenom abych to zkrátil jak jsem dal ten priklad tk to Photo2 atd. je vlastně brano z textboxu, ktere jsou napojeny na newUserPhoto
posielaj tam len user ID, User objekt tam vobec nemusis nastavovat EF si ho vie pri SaveChanges sam doplnit resp. ho vobec nepotrebuje ak ma cudzi kluc.
Jj díky nakonec jsem to tk udělal, ale příde mi to zvláštní. User si ulozim do pomocny proměny a u objektu ktery vkladam do db nastavim user na null a pak ho tam za vratim.
Nějak pořád nechápu, proč do toho objektu "UserPhoto" pořád tlačíš celý objekt "User"? K čemu to tam potřebuješ, když přeci v DB máš referenci na User pomocí cizího klíče, ne? Pohodlně tam stačí mít ID_user a všechno musí makat OK...
Todle je skutečně problém EF a nejen EF.. je to problém obecně ORM ( i kdžy todle je zrovna asi specifické pro EF a tuším že i doctrine) .. nikdy sis nekladl otázku:
"a proč to jako nemůžu udělat?"
Ty bys měl být schopný todle udělat.. problém je, že tě nedostatečně
ten EF odstiňuje od databáze a od toho jak uvnitř funguje (od identity
mapy).
proto první věc, co zkušený člověk udělá, když začne pracovat s nějakým ORM a myslí to vážně (třeba při použití DDD) je, že vypne:
Případně.. to nechá zapnuté, ale rozhodně z DAL vstvy nevrací žádný "entity object".
Tedy - pokud už má potřčbu dělat dynamický repository.. nemá
Repository<T> where T: entita
ale
Repository<TEntita, TModel> where T:entita, TModel:DomainObject.:
A uvnitř toho repository - jeste pred tim, než se ten objekt navratí se to
mapuje..
Hodně jednoduše (a ne ideálně) to jde udělat pomocí Automapperu, lépe to jde udělat pomocí Select() expressionu.
Stejně tak samozřejmě tvůj DAL přijímá doménový objekt, uvnitř ho mapuje na Entitu a to stylem:
Jedině tak totiž uděláš opravdu funkční abstrakci.
Zobrazeno 12 zpráv z 12.