2016-11-17 1 views
2

Ich brauche F #, um mit Entity Framework wunderbar zu arbeiten. Ich versuche, Beispiel von hier anzupassen: https://blogs.msdn.microsoft.com/visualstudio/2011/04/04/f-code-first-development-with-entity-framework-4-1/ Das Problem ist, dass Aufzeichnungserklärung dort so beängstigend ist, dass es für mich gerade inakzeptabel ist.Kürzeste Syntax für Entity Framework kompatible POCO

type public Car() = 
    let mutable m_ID : int = 0 
    let mutable m_name : string = "" 

    [<Key>] 
    member public this.ID  with get() = m_ID 
           and  set v = m_ID <- v 
    member public this.Name  with get() = m_name 
           and  set v = m_name <- v 

Ich habe versucht CLIMutable so:

module Program  

[<CLIMutable>] 
type Car = {   
    Name:string   
}   
let c = new Car(Name = "Honda") 

Es ein Fehler aufgetreten ist: "Keine contructors sind für den Typ 'Car' verfügbar". Wie ich verstehe diese Antwort könnte eine Erklärung sein: https://stackoverflow.com/a/28845368/585819

Ich habe auch versucht, Dinge wie:

[<CLIMutable>] 
type Car = 
    { 
    ID:int   
    } member this.Name = "" 

Der Fehler ist gleich. Ich bin sehr enttäuscht. Kann jemand damit helfen?

+1

Was ich normalerweise mache, ist meine POCO Klassen und DbContext in einem separaten Projekt zu erstellen. Auf diese Weise kann ich auch Code-Erstmigrationen nutzen. –

+0

@ OJRaqueño Ich habe versucht, sie in ein separates Projekt (Bibliothek) zu setzen. Aber der Fehler ist der gleiche. Ich weiß nicht, möglicherweise sind einige spezielle kompilierende Optionen erforderlich. – alehro

Antwort

0

Hier ist, was zu funktionieren scheint, für mich. Dies ist kein Rekord, sondern eine Klasse. Auch könnte es wahrscheinlich nicht POCO genannt werden.

//file DataModel.fs 
module DataModel 
open System.ComponentModel.DataAnnotations 
open System.Data.Entity 
type Car()= 
    [<Key>] 
    member val Id = 0 with get,set 
    member val Name = "" with get,set 

type public CLCars() = 
    inherit DbContext() 
    member val Cars: DbSet<Car> = base.Set<Car>() with get,set 

//file Program.fs 
module Program 
open DataModel 

    let db = new CLCars() 
    let c = new Car(Name="Honda") 
    db.Cars.Add(c) |> ignore 
    db.SaveChanges() |> ignore 
5

Das Attribut CLIMutable hat keine Auswirkungen auf F # use-sites. Auf den hinzugefügten Standardkonstruktor kann nicht von F # -Benutzercode zugegriffen werden, und dies sind veränderbare Eigenschaften. Wenn Sie die EF-Änderungsverfolgung (innerhalb von F #) verwenden möchten, sind Datensätze keine gute Wahl (da Sie sie nur ändern können, wenn Sie alle Felder mutable deklarieren). Wenn möglich, z. die SQL Provider. Auf der anderen Seite z.B. Dapper unterstützt das Serialisieren/Deserialisieren von POCOs und somit F # -Einträgen.

Wie der Datensatz aus F # Perspektive unveränderlich aussieht, regelmäßige Konstruktion gilt:

let c = { Name = "Honda" } 

oder (eindeutig zu machen, wenn Sie auch type Person = { Name : string } zB haben)

let c = { Car.Name = "Honda" } 
let c : Car = { Name = "Honda" } 
let c = { Name = "Honda" } : Car 
+0

Ich brauche keine EF-Änderungsverfolgung. Der einzige Grund, warum ich EF verwenden möchte, ist, dass es ein DB-Schema aus POCOs erstellt. Ich habe dafür kein alternatives Werkzeug gefunden. – alehro

Verwandte Themen