WCF, EF4, POCO og serialisering

by Israr Khan 22. desember 2010 11:20

Testet ut EF4, Poco og WCF? Fått en feilmelding av følgende type:

Receivera:InternalServiceFaultCannot serialize parameter of type 'System.Data.Entity.DynamicProxies.FOO' (for operation 'GetFoo', contract 'FooService') because it is not the exact type 'Model.Foo' in the method signature and is not in the known types collection. In order to serialize the parameter, add the type to the known types collection for the operation using ServiceKnownTypeAttribute

Lagt merke til at objektene som er virtuelle blir definert som Proxy-Typer? Dette betyr at selv om basen består av ditt POCO-objekt, vil det under runtime bli generert et dynamicProxy-object, som ikke gjenspeiler ditt objekt direkte(men det gjør det indirekte som følge av at basen består av ditt poco-object). Dette skaper problemer når du skal serialisere disse objektene ut i pipen, hente ut attributter, kjøre reflection og siden proxy-typene heller ikke er known types, må disse behandles korrekt, enten ved å opprette en egen DataContractResolver, eller ved å skru av ProxyCreation.

Så perfekt - burde vært enkelt? Tja: Sjekk ut release notes for CTP5:

DbContext.ObjectContext has moved:
Rather than being a protected member we have made the underlying ObjectContext available via an explicitly implemented interface, this allows external components to make use of the underlying context. Getting the context now looks like: ((IObjectContextAdapter)myContext).ObjectContext

Så DbContext har ingen direkte property hetende ObjectContext. Så bruk  ((IObjectContextAdapter)myContext).ObjectContext for å få tilgang til ObjectContext-en for å skru av ProxyCreation.

Sjekk ut:

http://msdn.microsoft.com/en-us/library/ee705457.aspx, Walkthrough: Serialize POCO Proxies with WCF
http://msdn.microsoft.com/en-us/library/dd456853.aspx , Working with POCO Entities.
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-released.aspx , Release notes for CTP5

Tags: , , , , , , , ,

Koding

Kompositte nøkler i EF4 - CTP5

by Israr Khan 14. desember 2010 08:56

(Caset nedenfor og klassen er simplifisert for å kun inneholde det mest nødvendige for å forstå hvordan dette løses).

Ofte kommer du opp i situasjoner hvor du har en mange-til-mange relasjon via en hjelpetabell, og ønsker å definere dette manuelt ved hjelp av EF4, CTP5 og POCO.

Gitt du har en hjelpetabell som følger:

ProduktBestillinger
ProduktId - int
BestillingId - int
Type - string

- Må POCO-et ditt se ut som følger:
   
    public class ProduktBestillinger
    {
        [Key]
        [Column(Order=0)]
        public int ProduktId { get; set; }
        
        [Key]
        [Column(Order = 1)]
        public int BestillingId { get; set; }
                
        public string Type { get; set; }

        public virtual Produkt Produkt { get; set; } //Frivillig felt for å kunne navigere til produktet.

        public virtual Bestilling Bestilling { get; set; } //Frivillig felt for å kunne navigere til bestillingen..

     }

Legg merke til at for å få brukt kompositte nøkler med POCO må du markere propertyen for primærnøklene i klassen din med [KEY] samt at du må gi presends til nøklene dine med [Column(Order=X)] (Begge finnes under System.ComponentModel.DataAnnotations. Husk at du må legge til en referanse til System.ComponentModel.DataAnnotations i tillegg til EntityFramework.dll).

Hvis du ikke inkluderer presendens på nøklene dine - vil følgende feilmelding kastes:

Unable to determine composite primary key ordering for type 'Snowball.Model.Campaign.CampaignApp'. Use the ColumnAttribute or the HasKey method to specify an order for composite primary keys.

 

Tags: , , ,

Koding

Data Annotations i EF4 (inkludert CTP5)

by Israr Khan 14. desember 2010 08:36

En liten oppfølging til dere som nettopp har tatt i bruk POCO og kjører helt uten designer:

Noen av data annotations-attributtene ligger i selve EntityFramework.dll-en som tilhører CTP5, de resterende data annontation attributtene ligger fortsatt i System. System.ComponentModel.DataAnnotations.dll!

Dette betyr at du må ha en referanse til både og gitt du f.eks. skal manuelt definere [KEY] og en god del andre attributter :)

 

Tags: , , , , ,

Koding

Entity Framework CTP5 POCO og relasjoner: Navigering bakover (inversering)

by Israr Khan 13. desember 2010 12:17

(Både caset nedenfor og klassene er simplifiserte for å kun ta med det mest nødvendige for å forstå hvordan dette løses)

Kom opp i en situasjon hvor jeg ønsket å bruke POCO i EF CTP5 hvor jeg f.eks. har en entitet som heter "Produkter" som er lenket til 0:n antall bestillinger. En bestilling er kun for ett gitt produkt.

Fra bestillinger-entiteten ønsket jeg å kunne navigere bakover tilbake til bestillingen produktet, og endte opp med følgende klasser:

    public class Product
    {
        public Guid Id { get; set; }
        public string Name{ get; set; }  
        public virtual ICollection<Order> Orders { get; set; } // Liste med alle bestillinger for et gitt produkt
    }

    public class Order
    {
        public Guid Id { get; set; }
        public string Name{ get; set; }  
        public virtual Product Product { get; set; } //Peker tilbake til det _ene_ produktet som er bestilt.
    }

Kontekst-klassen vår som faktisk kommuniserer med databasen ser slik ut:

  public class DataContext : DbContext
    {
        public DbSet<Product> Products { get; set; }
    }

Vips - gitt entiten Product i din i databasen har en relasjon til Order - så er det tut og kjør: Du trenger _INGENTING_ annet av deklarering av klassen, attributter o.s.v! Du kan nå slå opp Produkter og få alle bestillinger for det gitte produktet, og også gå bakover fra en bestilling opp til produktet.

var context = new DataContext();
var productList = from product in context.Products
                        select product; 

var order = productList[0].Orders[0];
var productForOrder = order.Product;

Sweet!

Les også litt om naming conventions med tanke på EF4 på :
http://blogs.msdn.com/b/efdesign/archive/2010/06/01/conventions-for-code-first.aspx
Litt om data anotation:
http://blogs.msdn.com/b/efdesign/archive/2010/03/30/data-annotations-in-the-entity-framework-and-code-first.aspx
Og litt mer overordnet i.f.h til CTP5
http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-released.aspx
http://blogs.msdn.com/b/adonet/archive/2010/12/14/ef-feature-ctp5-model-amp-database-first-with-dbcontext.aspx 

Tags: , , ,

Koding

Om meg

Kodeverk.net er drevet av .Net-utvikler Israr Khan.

Han jobber som gruppeleder og  seniorkonsulent for Capgemini Norge.

Hans fokusområder er alt innenfor .Net-verden, og har foreløpig tilgode å finne noe som han ikke finner av interesse innenfor teknologien. Han er drevet av genuin interesse for teknologi og lever for faget.


 

View Israr Khan's profile on LinkedIn

Month List