in vs2015 ho usato un programma esterno per creare / modificare il mio database e aggiornarlo in vs con il designer ef. Con vs2017 è anche possibile utilizzare il designer con alcuni strumenti di terze parti, ma prima voglio passare al codice. in questo contesto voglio passare la mia libreria di classi allo standard .net.
Ma ho problemi a far funzionare i miei database. Ecco un esempio, quello che vedo quando apro il file EDMX.
L'ID non viene incrementato, è fornito da un servizio esterno. ogni utente del servizio ha un ID univoco e lo memorizzo lì.
E ora i miei (molto semplici) codici primi modelli:
public class Users {
public int UserID { get; set; }
public string Name { get; set; }
public Currency Currency { get; set; }
public TimeWatched TimeWatched { get; set; }
}
public class Currency {
public int UserID { get; set; }
public int CurrencyValue { get; set; }
public Users Users { get; set; }
}
public class TimeWatched {
public int UserID { get; set; }
public long Time { get; set; }
public Users Users { get; set; }
}
Il mio DbContext si presenta così:
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
public class context : DbContext {
public DbSet<Users> Users { get; set; }
public DbSet<Currency> Currency { get; set; }
public DbSet<TimeWatched> TimeWatched { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = "test.db" };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
optionsBuilder.UseSqlite(connection);
}
protected override void OnModelCreating(ModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Users>()
.HasKey(c => c.UserID);
modelBuilder.Entity<Users>()
.Property(c => c.UserID)
.ValueGeneratedNever();
modelBuilder.Entity<Users>()
.HasOne(a => a.Currency)
.WithOne(b => b.Users)
.HasForeignKey<Currency>(b => b.UserID);
modelBuilder.Entity<Users>()
.HasOne(a => a.TimeWatched)
.WithOne(b => b.Users)
.HasForeignKey<TimeWatched>(b => b.UserID);
modelBuilder.Entity<Currency>()
.HasKey(k => k.UserID);
modelBuilder.Entity<TimeWatched>()
.HasKey(k => k.UserID);
}
}
Lo prova così:
using(var context = new testStandard.context()) {
context.Database.EnsureCreated();
var user = new Users {
Name = "test",
TwitchUser = 123456,
Currency = new Currency {
TwitchUser = 123456,
CurrencyValue = 999
},
TimeWatched = new TimeWatched {
TwitchUser = 123456,
Time = 500
}
};
context.Users.Add(user);
context.SaveChanges();
}
using(var context = new context()) {
var user = context.Users.First();
// Currency and TimeWatched are always null
}
Non so perché la valuta e il cronometraggio sono sempre nulli. cosa ho sbagliato?
Grazie Jamie! Ho trovato una soluzione:
using(var context = new context()) {
var user = context.Users
.Include(c => c.Currency)
.Include(tw => tw.TimeWatched)
.First();
}