J'ai suivi la réponse d'Adam ici et Entity Framework fonctionne maintenant et la méthode Seed()
fonctionne également.
Mais quand j'essaie d'accéder à la base de données comme ceci:
public User FindUserByID(int id)
{
return (from item in this.Users
where item.ID == id
select item).SingleOrDefault();
}
.............................................................................
// GET: /Main/
public ActionResult Index(int? id)
{
var db = UserDataBaseDB.Create();
if (!id.HasValue)
id = 0;
return View(db.FindUserByID(id.Value));
}
Il lève une exception à return (from item in this.Users
en indiquant:Exception Details: System.Data.SqlClient.SqlException: Invalid object name 'dbo.BaseCs'.
J'ai essayé de le remplacer par: return this.Users.ElementAt(id);
mais ensuite, cette exception est levée.
LINQ to Entities does not recognize the method 'MySiteCreator.Models.User ElementAt[User](System.Linq.IQueryable
1 [MySiteCreator.Models.User], Int32) ', et cette méthode ne peut pas être traduite en expression de magasin. »
Quelqu'un peut-il m'aider?
Je vous remercie!
Détails des exceptions: System.Data.SqlClient.SqlException: nom d'objet non valide 'dbo.BaseCs'
Cette erreur signifie que EF traduit votre LINQ en une instruction SQL utilisant un objet (très probablement une table) nommé dbo.BaseCs
, qui n'existe pas dans la base de données.
Vérifiez votre base de données et vérifiez si cette table existe ou si vous utilisez un nom de table différent. En outre, si vous pouviez publier un lien vers le didacticiel que vous suivez, il serait utile de suivre ce que vous faites.
Il y a probablement une discordance entre le nom de la classe de modèle et le nom de la table tel que mentionné par 'adrift'. Faites-les identiques ou utilisez l'exemple ci-dessous pour conserver le nom de la classe de modèle différent du nom de la table (ce que j'ai fait pour OAuthMembership). Notez que le nom de la classe de modèle est OAuthMembership alors que le nom de la table est webpages_OAuthMembership.
Soit fournir un attribut de table au modèle:
[Table("webpages_OAuthMembership")]
public class OAuthMembership
OU fournissez le mappage en surchargeant DBContext OnModelCreating:
class webpages_OAuthMembershipEntities : DbContext
{
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
var config = modelBuilder.Entity<OAuthMembership>();
config.ToTable( "webpages_OAuthMembership" );
}
public DbSet<OAuthMembership> OAuthMemberships { get; set; }
}
Si vous fournissez des mappages comme celui-ci:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new ClassificationMap());
modelBuilder.Configurations.Add(new CompanyMap());
modelBuilder.Configurations.Add(new GroupMap());
....
}
N'oubliez pas d'ajouter la carte pour BaseCs.
Vous n'obtiendrez pas d'erreur de compilation si elle manque. Mais vous obtiendrez une erreur d'exécution lorsque vous utiliserez l'entité.
EF recherche une table nommée dbo.BaseCs. Peut-être un problème de pluralisation du nom d’entité. Découvrez ce link .
EDIT: Lien mis à jour.
Cela pourrait me poser un problème de pluralisation des noms de table. Vous pouvez désactiver cette convention à l'aide de l'extrait ci-dessous.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
Si tout va bien avec votre ConnectionString
, vérifiez le nom de votre collection DbSet dans votre fichier de contexte db. Si cela ne correspond pas aux noms de table de base de données, vous obtiendrez également cette erreur.
Ainsi, par exemple, catégories, produits
public class ProductContext : DbContext
{
public DbSet<Category> Categories { get; set; }
public DbSet<Product> Products { get; set; }
}
doit correspondre aux noms de table de base de données réels:
Vous devez définir le schéma et la table à deux endroits différents.
le contexte définit le schéma
public class BContext : DbContext
{
public BContext(DbContextOptions<BContext> options) : base(options)
{
}
public DbSet<PriorityOverride> PriorityOverrides { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
builder.HasDefaultSchema("My.Schema");
builder.ApplyConfiguration(new OverrideConfiguration());
}
}
et pour chaque table
class PriorityOverrideConfiguration : IEntityTypeConfiguration<PriorityOverride>
{
public void Configure(EntityTypeBuilder<PriorityOverride> builder)
{
builder.ToTable("PriorityOverrides");
...
}
}
Au lieu de
modelBuilder.Entity<BaseCs>().ToTable("dbo.BaseCs");
Essayer:
modelBuilder.Entity<BaseCs>().ToTable("BaseCs");
même si votre nom de table est dbo.BaseCs