2010-11-20 2 views
0

Ich versuche, NHibernate in F # -Projekt von FluentNHibernate zu konfigurieren.F #: Nachschlagen auf Objekt unbestimmter Art Bei der Verwendung von FluntNHibernate

static member GetNHibernateConfig = 
    Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
       .ConnectionString(fun c -> c.FromConnectionStringWithKey("connectionString") |> ignore) 
        .ShowSql()) 

Visual Studio Highlight "c.FromConnectionStringWithKey" mit Fehler:

Lookup auf Objekt von unbestimmter Art basieren auf Informationen, die vor diesem Programmpunkt. Vor diesem Programmpunkt kann eine Typ-Annotation erforderlich sein, um den Typ des Objekts einzuschränken. Dies kann ermöglichen, dass die Suche aufgelöst wird.

Antwort

3

Ich weiß nichts darüber, aber das Web für API-Dokumentation von der Suche, würde ich versuchen, Ändern

fun c -> 

zu

fun (c:ConnectionStringBuilder) -> 

weil diese

http://fluentnhibernate.org/api/FluentNHibernate.Cfg.Db/PersistenceConfiguration%602.htm#ConnectionString

schlägt mir vor, dass das t sein kann Der Typ c.

EDIT:

(. Anscheinend ist der Typ ist MsSqlConnectionStringBuilder)

Wie auch immer, ganz allgemein, wenn Sie laufen in F # nicht Lambda-Typen Folgern, wenn C# der Fall ist, dann wahrscheinlich

  • Sie‘ Verwenden Sie eine Methode mit mehreren Überladungen
  • eine Teilmenge der Überladungen verwenden Action oder Func

und die einfachste Sache ist es, den Action oder Func Delegattyp explizit hinzuzufügen, damit F # die Überlastung korrekt auflöst. In diesem Fall denke ich,

Ändern
.ConnectionString(fun c -> ...) 

zu

.ConnectionString(Action<MsSqlConnectionStringBuilder>(fun c -> ...)) 

behebt es, und das ist oft die zweckmäßigste Weise entsperrt zu bekommen.

+0

es mit jedem Überlastung nicht kompatibel ist, sagt es 'ConnectionStringBuilder -> unit' mit nicht kompatibel ist' MsSqlConnectionStringBuilder -> unit' und 'ConnectionStringBuilder -> unit' nicht kompatibel mit' string' –

+0

es Geben Sie dann Hinzufügen des 'MsSql 'Präfix. Dann erwarte ich, dass es funktioniert. – Brian

+0

Ich erwarte auch, dass das Einpacken 'neuer Aktion <_> (...)' um den 'Spaß c ->' Lambda funktioniert. – Brian

1

nicht sicher, warum, aber erklärt, die Art des Funktionsparameters funktioniert:

Fluently.Configure() 
     .Database(MsSqlConfiguration.MsSql2008 
      .ConnectionString(fun (c: MsSqlConnectionStringBuilder) -> c.FromConnectionStringWithKey("connectionString") |> ignore) 
       .ShowSql()) 

Wie auch immer, werden Sie besser dran # mit FunctionalNHibernate statt FluentNHibernate in F.

+0

Warum, wahrscheinlich gibt es mehrere Überladungen von '.ConnectionString', und C# und F # Typ Inferenz funktionieren anders und ich denke, C# findet es heraus, aber F # nicht. – Brian

+0

@Brian: seltsame Sache ist, eine Überladung nimmt eine 'Aktion <_>' und die andere nimmt eine Zeichenfolge. Es sollte keine Verwirrung geben? –

+0

Genauer gesagt funktioniert ein 'Action ' –