2010-02-04 15 views
24

En mi base de datos tengo una tabla llamada StaffMembersNullReferenceException cuando se hace InsertOnSubmit en LINQ to SQL

cuando traigo esto en mi proyecto de .net como a través de LINQ to SQL se crea una clase de entidad miembro de personal

Ahora también he creado un StaffMember de clase parcial en mi proyecto también, para agregar propiedades adicionales que utilizo en otras capas superiores. p.ej. Propiedad de IsDeleted. Esta clase parcial también hereda una clase e interfaz abstracta para asegurarse de que también se implementen otras propiedades.

Ahora cuando se crea una nueva instancia de "miembro de personal"

por ejemplo. StaffMember newStaff = new StaffMember(); y darle todas sus propiedades, etc.

y luego llamar a InsertOnSubmit en el contexto a través de mi Administrador.

Add(StaffMember newStaff) 
{ 
    context.StaffMembers.InsertOnSubmit(newStaff); 
    context.Save(); 
} 

Obtengo un "Referencia a objeto no establecida como instancia de un objeto" de error.

en context.StaffMembers.InsertOnSubmit (newStaff);

La pila dice

" at System.Data.Linq.Mapping.EntitySetDefSourceAccessor`2.GetValue(T instance)\r\n at 
System.Data.Linq.Mapping.MetaAccessor`2.GetBoxedValue(Object instance)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.StandardTrackedObject.get_HasDeferredLoaders()\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary`2 visited, Boolean recurse, Int32 level)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj, Boolean recurse)\r\n at 
System.Data.Linq.ChangeTracker.StandardChangeTracker.Track(Object obj)\r\n at System.Data.Linq.Table`1.InsertOnSubmit(TEntity entity)\r\n at 
BusinessObjects.StaffMemberManager.Add(StaffMember staffMember) in  
C:\\StaffMemberManager.cs:line 251" 

Cualquier idea de por qué podría estar sucediendo esto y cuál es la manera de evitarlo.

Gracias

Respuesta

42

bien he encontrado mi respuesta en http://social.msdn.microsoft.com/Forums/en/linqprojectgeneral/thread/0cf1fccb-6398-4f16-920b-adef9dc4ac9f

en caso de que algunos todavía está en busca de una respuesta.

Este problema ocurre cuando sobrecarga el constructor en la clase parcial y no llama al constructor predeterminado en él.

El constructor predeterminado de la entidad hace pocas cosas que el objeto Context requiere.

Por lo tanto, si usted tiene un constructor de la sobrecarga en su clase parcial y utilizarlo para crear el objeto, asegúrese de que el constructor por defecto se llama en la primera línea

en C# se puede hacer esto mediante la

por ejemplo, .

Customer(string custID) 

es necesario agregar un

Customer(string custID):this() 

en C# donde cliente es mi clase y de atención al cliente (cadena custID): este() es mi sobrecarga de constructor de mi clase parcial.

+0

1 solucionado mi problema! ¡¡Gracias por la publicacion!! – xandercoded

+0

Acabo de resolver mi problema también ... muchas gracias – Quango

+0

Jesús, nunca había pensado en eso ... ¡Gracias! – Shackles

1

En algún momento, simplemente se olvidó de añadir esta línea a la clase base:

[InheritanceMapping (Código = "Clase", Tipo = typeof (Clase))]