Avatar billede dl Nybegynder
07. juli 2009 - 21:15 Der er 10 kommentarer og
1 løsning

ADO.NET Entityes, CRUD, Attach/deattach obj

Jeg er igang med at lave en lille controller, som skal kunne håndtere en CRUD (Create, Retrieve, Update, Delete).

Til dette formål vil jeg gerne bruge ADO.NET Entity framework, dels fordi jeg godt vil lære det at kende og dels fordi jeg synes det er smart at jeg ikke skal søgere for samtigehed.

Create:
DataContext.<Table>.InsertOnSubmit( Entity );
DataContext.SaveChange();

Retrieve:
var item = from o in DataContext.<Table> where o.guid = ?? select o;
return o;

Delete:
var item = from o in DataContext.<Table> where o.guid = ?? select o;
db.<Table>.DeleteOnSubmit(o);


Mit problem er så

Update:
Hvordan kan jeg gøre det ?
Jeg har fundet denne kode:

/// <summary>
        /// Attach an EntityObject that was modified when detached
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="objectDetached">DetachedObject</param>
        public static void AttachUpdated(this ObjectContext obj, EntityObject objectDetached)
        {
            if (objectDetached.EntityState == EntityState.Detached)
            {
                object original = null;
                if (obj.TryGetObjectByKey(objectDetached.EntityKey, out original))
                    obj.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
                else
                    throw new ObjectNotFoundException();
            }
        }


Denne kode skulle gerne gøre dette:
1) forsøger at loade obj fra databasen/storage.
2) overføre værdier fra mit deattach obj til det loadede obj.
3) klar til at gemme DataContext.db.SubmitChanges();

Jeg kan bare ikke komme ind til ObjectContext som overstående methode ligger sig ind i, Hvordan gør jeg ?
Hvordan kan jeg ellers håndtere Attach og deattach obj på ?
Jeg bruger mine Entityes hele vejen rundt i mit projekt.

Hvis nogle har nogle gode artikler er jeg også lutter øre ?

//dl
Avatar billede sirius Nybegynder
08. juli 2009 - 10:04 #1
Er jo lavet som en extension method til ObjectContext, hvis du vil have den i samme stil som din create, retrieve og delete kan du bruge følgende:

public static void Update(EntityObject objectDetached)
{
    if (objectDetached.EntityState == EntityState.Detached)
    {
        object original = null;
        if (DataContext.TryGetObjectByKey(objectDetached.EntityKey, out original))
            DataContext.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
        else
            throw new ObjectNotFoundException();
    }
}
Avatar billede dl Nybegynder
08. juli 2009 - 21:52 #2
Ja, det er rigtig det er en Extension mothede.

Det  hjælper mig bare ikke at lave den om til en public void ...
Da jeg ikke har adgang til ObjectContext hvordan skal jeg så kalde den ?

DataContext har ikke TryGetObjectByKey og ApplyPropertyChanges.

Jeg har set lidt på ObjectContext, og det er ikke en DataContext, desvære, eller noget det ligger som noget arv.
Avatar billede dl Nybegynder
08. juli 2009 - 23:20 #3
Jeg har enda forsøgt mig med disse to:

// fejl: noget omkrig Opdatering politik
db.Sections.Attach(section, true);

// Dublicated key.
db.Sections.Attach(section, section_db);

Så ingen hen der.

Jeg ved godt jeg kan hente mit obj ud af db, og så bare mappe over, men dette problem burde der et eller andet sted være taget højde for i .Net  .
Avatar billede dl Nybegynder
08. juli 2009 - 23:28 #4
http://msdn.microsoft.com/en-us/library/bb896248.aspx

Citat start

In the following example, an updated SalesOrderDetail object is passed to the UpdateItemChanges method, along with the original object. This enables changes to be applied without querying for the object or having to persist it in memory.

Citat slut

kode start:

// Attach the original item to the object context.
            advWorksContext.Attach(originalItem);

            // Call the ApplyPropertyChanges method to apply changes
            // from the updated item to the original version.
            advWorksContext.ApplyPropertyChanges("SalesOrderDetail",
                updatedItem);

            advWorksContext.SaveChanges();

kode slut


Men jeg kan ikke finde methoden: ApplyPropertyChanges

???

Hvad sker der her ? :S
Avatar billede sirius Nybegynder
10. juli 2009 - 09:14 #5
Hvilken version af Entity framework er det du bruger?
Avatar billede dl Nybegynder
10. juli 2009 - 11:05 #6
Jeg fandt ud af i går aften, at alle de artikler jeg havde set på var noget som kommer i .net 4 og i den nye Visual Studio 2010.
Så det kan jeg kun undskylde.

Men det ændre stadig ikke på mit problem med updatering.

Så her tænkter jeg på, at have en metohed, som med reflection kan tage en entity fra database og den ændret entity, og kopier alle ændringere over, og derefter gemme min entity.

Hvad synes folk om den tanke ?
Avatar billede sirius Nybegynder
10. juli 2009 - 11:18 #7
Det kode jeg skrev virker altså til den udgave af Entity frameworket som er udsendt med Visual Studio 2008 SP1, og sikkert også ældre.

Hvis du bruger Entity framework 4.0 som gerne skulle komme med .NET 4.0 så bliver det en anelse nemmere.

Hvis du ikke kan få det til at virke med det kode du har må du vise lidt mere af din kode.
Avatar billede dl Nybegynder
10. juli 2009 - 12:55 #8
Jeg forsøgte med din kode:

Men kunne ikke finde  EntityObject.

// dl
Avatar billede dl Nybegynder
11. juli 2009 - 20:05 #9
Godt, jeg har lagt din kode i en RepositoryBase

        public static void Update(EntityObject objectDetached)
        {
            if (objectDetached.EntityState == EntityState.Detached)
            {
                object original = null;
                if (DataContext.TryGetObjectByKey(objectDetached.EntityKey, out original))
                    DataContext.ApplyPropertyChanges(objectDetached.EntityKey.EntitySetName, objectDetached);
                else
                    throw new ObjectNotFoundException();
            }
        }


Og tilføjet de enkelte ref.


I min SectionRepositury har jeg en update metohde som har en Section fra mit DataContext af.

public void Update(Section section)
        {
            var section_db = (from o in db.Sections
                              where o.SectionGuid == section.SectionGuid
                              select o).SingleOrDefault<Section>();

            if (section_db == null)
                throw new SectionDoesNotExist();

            RepositoryBase.Update(section);

            //this.UpdateEntityProperty<Section>(section, section_db);

            db.SubmitChanges();
        }



Jeg få disse fejl med din kode:

Error    1    'System.Data.Linq.DataContext' does not contain a definition for 'TryGetObjectByKey'

Error    2    'System.Data.Linq.DataContext' does not contain a definition for 'ApplyPropertyChanges'

Fejl ved forsøg på at kalde din methode med: RepositoryBase.Update(section); // Et Section obj.

Hvordan kalder jeg din metode, og hvordan kommer jeg igemmen de fejl ?
Avatar billede dl Nybegynder
11. juli 2009 - 20:06 #10
Min db er det samme som at sige:

Mit DataContext = new DataContext(); 

Her ligger alle mine database entityes.
Avatar billede dl Nybegynder
16. juli 2009 - 12:53 #11
Jeg er gået over til dotNet Version 4.0. Da det skulle være nemmere og lave entites :)

sirius > Jeg fik aldrig din kode til at virke.
Dog har dit svar, givet mig grund til at gå over i DotNet 4.0 :)

Hvis du stadig er  hooked på point, så skriv !

// dl
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester