Laden...

[gelöst] Entity Framework DbSet wirft "NullReferenceException"

Erstellt von Repac3r vor 8 Jahren Letzter Beitrag vor 8 Jahren 4.473 Views
R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren
[gelöst] Entity Framework DbSet wirft "NullReferenceException"

Schönen Mittag euch,

ich versuche gerade, mittels dem Entity Framework mich auf meine Mysql-DB zu verbinden und ein paar Beispiel-Werte abzulegen.

Mit der Datenbank selbst kann ich mich mitlerweile verbinden. Sobald ich jedoch versuche, auf die DbSet-Property zuzugreifen, bekomme ich eine Null-Reference-Exception.

Hier mal ein Ausschnitt aus meiner App.config:


 <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  
  <connectionStrings>
    <add name="MysqlDefaultConnection" connectionString="server=localhost;user id=***;password=***;database=***" providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  
  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>

Hier mein DbContext (zum Testen, habe ich auf die schnelle das Entity in der gleichen Datei implementiert):


 public class MysqlContext: DbContext
    {
        public DbSet<Test> Tests { get; set; }

        public MysqlContext(): base("MysqlDefaultConnection")
        {
            Database.Connection.Open();
        }
            
    }

    [Table("test")]
    public class Test
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
    }

Die Tabellen-Beschreibung sieht so aus:


CREATE TABLE `test` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(45) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mittels:


var context = new MysqlContext();
var testRepo = new GenericRepository<Test>(context);
testRepo.Add(new Test { Name = "Test" });

initialisiere ich die Datenbank und das Repository, welches auf das dazugehörige DbSet zugreift. Sobald ich hier jedoch versuche, das Entity hinzuzufügen, bekomme ich die besagte Exception:

Fehlermeldung:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

bei MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection)
bei System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection)
bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple3 k) bei System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) bei System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) bei System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection connection, DbProviderManifest&amp; providerManifest) bei System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection) bei System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext) bei System.Data.Entity.Internal.RetryLazy2.GetValue(TInput input)
bei System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
bei System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
bei System.Data.Entity.Internal.Linq.InternalSet1.Initialize() bei System.Data.Entity.Internal.Linq.InternalSet1.get_InternalContext()
bei System.Data.Entity.Internal.Linq.InternalSet1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) bei System.Data.Entity.Internal.Linq.InternalSet1.Add(Object entity)
bei System.Data.Entity.DbSet1.Add(TEntity entity) bei **ProjectName**.DataAccess.Implementation.GenericRepository1.Add(TEntity entity) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.DataAccess.Implementation\GenericRepository.cs:Zeile 93.
bei ProjectName.Application.Program.RegisterDependencies(IDependencyResolver resovler) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.Application\Program.cs:Zeile 27.
bei ProjectName.Application.Program.Main(String[] args) in C:\Users*DesktopUser*\Documents\Visual Studio 2015\Projects*ProjectName**ProjectName*.Application\Program.cs:Zeile 15.
bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()

Hat jemand "auf die schnelle" eine Idee, was genau mein Fehler ist und was ich daran zuändern habe? Wäre euch sehr dankbar.

Grüße...

16.834 Beiträge seit 2008
vor 8 Jahren

Dein DbSet heisst Tests und nicht Test.

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren

Dein DbSet heisst Tests und nicht Test.

Auch das habe ich schon umbenannt, bekomme jedoch den gleichen Fehler.

16.834 Beiträge seit 2008
vor 8 Jahren

Was sagt Dein Debugger genau, was Null ist?

W
955 Beiträge seit 2010
vor 8 Jahren

.. und zwar in GenericRepository.cs:Zeile 93?

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren

Was sagt Dein Debugger genau, was Null ist?

Sollte doch im Stacktrace drinne stehen, nämlich:


 bei MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)

Jedoch, bekomme ich keine Fehlermeldung, wenn ich mittels:


 Database.Connection.Open();

die Verbindung öffne, im Log des Mysql-Servers kann ich auch erkennen, dass ich gerade mit der Datenbank mich verbunden habe.

16.834 Beiträge seit 2008
vor 8 Jahren

Ich glaube nicht, dass

 MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection)

Zeile 93 in GenericRepository.cs ist.

[Artikel] Debugger: Wie verwende ich den von Visual Studio?

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren

Das ganze wird im Konstruktor wie folgt initialisiert:


        private readonly MysqlContext _context;
        private IDbSet<TEntity> _entites;

        public GenericRepository(MysqlContext context)
        {
            _context = context;
            _entites = _context.Set<TEntity>();
        }

Die Klasse "MysqlContext" kann man sich oben, in meinem ersten Post ansehen.

Grüße

Hinweis von MrSparkle vor 8 Jahren

Fullquote entfernt. Bitte beachte [Hinweis] Wie poste ich richtig?, Punkt 2.3

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren


>


>

Ich verstehe aber nicht, warum das im Zusammenhang des Entity-Frameworks auftaucht.
Selbst wenn ich direkt auf das DbSet im DbContextx zugreife, welches nicht Null ist, bekomme ich diesen Fehler. Denn alle Variablen auf die ich zugreife sind nicht null, laut Stacktrace scheint der Fehler von dem EntityFramework zu kommen, nicht von meinem Code, deswegen frage ich um Lösung.

16.834 Beiträge seit 2008
vor 8 Jahren

Wir haben leider keine Glaskugel.
Wenn Du nicht sagen willst, was genau null ist und was Zeile 93 ist, dann können wir Dich leider nur auf die NullReference-Seite des Forums verweisen, wie es MrSparkle gemacht hat.

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 8 Jahren

Wir haben leider keine Glaskugel.
Wenn Du nicht sagen willst, was genau null ist und was Zeile 93 ist, dann können wir Dich leider nur auf die NullReference-Seite des Forums verweisen, wie es MrSparkle gemacht hat.

Ich habe doch ganz genau gesagt, was die Zeile 93 ist? Ich selbst weiß nichteinmal was null ist, jede von mir erstelle Variable ist nicht null! Ich greife lediglich auf das DbSet zu, welches ebenfalls nicht null ist. Wie schon gesagt, die Exception kommt von Entity Framework, wie man es aus dem Stracktrace entnehmen kann.

Hiernochmal, dass ist die besagte Zeile 93:


        public virtual void Add(TEntity entity)
        {
            _entites.Add(entity);
        }

Diese hat der Moderator mr.sparkle aus mir nicht bekannten Gründen entfernt. Das ganze Konstrukt wir hier initalisiert:


      private readonly MysqlContext _context;
        private IDbSet<TEntity> _entites;

        public GenericRepository(MysqlContext context)
        {
            _context = context;
            _entites = _context.Set<TEntity>();
        }

Grüße

//Edit:
Scheinbar hatte die Version des Mysql-Providers welche ich nutze, ein Bug o.ä. Nach dem ich über Nuget die aktuelles assembly mir zog, lief alles ohne eine Exception durch. Trotzdem danke 😉