Sto cercando di riscrivere un esempio di C # EF Core (simile a quello dei documenti ) in F #. Ho un problema con HasIndex . In C #, la chiamata è HasIndex(b => b.Isbn)
, per creare un indice sulla colonna Isbn:
public class SampleContext : DbContext
{
public DbSet<Book> Books { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Book>().HasIndex(b => b.Isbn);
}
}
Facendo lo stesso in F #, HasIndex(fun b -> b.Isbn)
, non compila:
type public SampleContext() =
inherit DbContext()
[<DefaultValue>]
val mutable books: DbSet<Book>
member x.Books
with get() = x.books
and set v = x.books <- v
override __.OnModelCreating(modelBuilder) =
modelBuilder.Entity<Book>().HasIndex(fun b -> b.Isbn) // doesn't compile
|> ignore
Devo usare qualche citazione magica per far funzionare questo?
(Puoi ovviamente usare una stringa, HasIndex("Isbn")
, ma preferirei non eseguire i controlli del tempo di compilazione dalla finestra.)
In base alla risposta accettata in https://social.msdn.microsoft.com/Forums/vstudio/en-US/a0757965-4d13-4f88-910f-9ab5fd96277d/how-to-convert-c-linq-expression-in- f? forum = fsharpgeneral :
"F # 3.0 o versione successiva dovrebbe applicare una conversione orientata al tipo quando si passa una lambda in cui è prevista un'espressione."
Sembra che F # 3.0 e versioni successive convertiranno il lambda fintanto che lo si racchiude tra parentesi e si esegue il cast del valore restituito al tipo specifico che il metodo C # si aspetta (in questo caso "Sytem.Object")
Così:
modelBuilder.Entity<Book>().HasIndex( (fun b -> b.Isbn :> System.Object ) )
Compila con successo in .net core 2.0