2010-01-24 3 views
0

J'ai une table Rôle associé en relation 1-many avec table User dans ma base de données. J'ai créé des cours de cartographie LINQ manuellement:LINQ - Association mapping - Référence nulle sur InsertOnSubmit

[Table(Name="Role")] 
public class Role 
{ 
    private EntitySet<User> _Users; 

    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
    public int RoleID { get; set; } 
    [Column] public string Name { get; set; } 
    [Association(Name = "FK_User_Role", Storage = "_Users", ThisKey = "RoleID", OtherKey = "RoleID")] 
    public EntitySet<User> Users 
    { 
     get{ return this._Users; } 
     set{ this._Users.Assign(value);} 
    } 
} 

Le problème est que EntitySet Les utilisateurs ne peuvent pas être annulable si plus tard que je souhaite créer un nouveau rôle:

public override void CreateRole(string roleName) 
{ 
    try 
    { 
     Role new_role = new Role(); 
     new_role.Name = roleName; 
     _RolesRepository.SaveRole(new_role); 
    } 
    catch 
    { 
     throw; 
    } 
} 

Je reçois l'erreur message répertorié ci-dessous:

La référence d'objet n'est pas définie sur une instance d'un objet. Description: Une exception non gérée s'est produite lors de l'exécution de la requête Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Erreur:

Line 36: else Line 37: { Line 38:
rolesTable.InsertOnSubmit(role); ins = true; Line 39: } Line 40:

Source File: C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs
Line: 38

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]
System.Data.Linq.Mapping.EntitySetDefSourceAccessor 2.GetValue(T instance) +15
System.Data.Linq.Mapping.MetaAccessor
2.GetBoxedValue(Object instance) +44 System.Data.Linq.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember) +90
System.Data.Linq.StandardTrackedObject.get_HasDeferredLoaders() +102
System.Data.Linq.StandardChangeTracker.Track(MetaType mt, Object obj, Dictionary 2 visited, Boolean recurse, Int32 level) +187
System.Data.Linq.StandardChangeTracker.Track(Object obj, Boolean recurse) +80 System.Data.Linq.StandardChangeTracker.Track(Object obj) +9 System.Data.Linq.Table
1.InsertOnSubmit(TEntity entity) +172 DomainModel.Concrete.SqlRolesRepository.SaveRole(Role role) in C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs:38
DomainModel.Concrete.SklepomatRoleProvider.CreateRole(String roleName) in C:\inetpub\sklepomat\DomainModel\Concrete\SklepomatRoleProvider.cs:71 System.Web.Security.Roles.CreateRole(String roleName) +73
WebUI.Controllers.TempController.ble() in C:\inetpub\sklepomat\WebUI\Controllers\TempController.cs:29
lambda_method(ExecutionScope , ControllerBase , Object[]) +74
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 parameters) +24
System.Web.Mvc.<>c__DisplayClassa.b__7() +52 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func 1 continuation) +254
System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
System.Web.Mvc.Controller.ExecuteCore() +126
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27 System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151 System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

Je suppose que ce que EntitySet<User> _Users équivaut à null ... Ai-je raison! Ce qui devrait être affecté à _Users s'il ne peut pas par nullable!?

MISE À JOUR:

exception est levée

 try { rolesTable.InsertOnSubmit(role);} 
     catch (Exception ex) 
     { 
      throw ex; 

     } 

Lorsque les champs de l'objet de rôle sont fixés à:

_Users = null, 
Name = "New name", 
RoleID = 0, 
Users = null 

Répondre

4

est ici un lien vers grand tutoriel liés à la cartographie LINQ: http://www.codeproject.com/KB/linq/linqtutorial.aspx Mon code final est:

[Table(Name="Role")] 
public class Role 
{ 
    private EntitySet<User> _Users = new EntitySet<User>(); 

    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
    public int RoleID { get; set; } 
    [Column] public string Name { get; set; } 
    [Association(Name = "FK_User_Role", Storage = "_Users", ThisKey = "RoleID", OtherKey = "RoleID")] 
    public EntitySet<User> Users 
    { 
     get{ return this._Users; } 
     set{ this._Users.Assign(value);} 
     } 
} 
+1

'private EntitySet _Users = new EntitySet ();' - travaillé pour moi –

+0

Vous devez accepter votre propre réponse si cela décrit la façon dont vous avez résolu votre problème. – Matthieu

1

Vous avez un problème dans votre code et/ou d'un schéma . La propriété Role.RoleID, qui est votre clé primaire, est un type int nullable. Ça ne peut pas être. Les valeurs de clé primaire ne peuvent pas contenir de valeurs nulles.

+0

Il a été changé pour nullable car RoleID est généré dans la base de données, donc je pensais que je ne peux pas passer une valeur et c'est la raison de l'erreur. Je l'ai changé en type int normal, mais il ne résout pas le problème ... (voir UPDATE) – Kotu

Questions connexes