LINQ - 关联映射 - InsertOnSubmit上的空引用

时间:2010-01-24 01:04:59

标签: c# .net linq exception nullreferenceexception

我有一个表与我的数据库中的表User相关的1-many关联的Role。我手动创建了LINQ映射类:

[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);}
    }
}

问题是EntitySet Users不能为空,所以如果我希望创建新角色的时间晚于:

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

我收到以下错误消息:

对象引用未设置为对象的实例。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

  

异常详细信息:System.NullReferenceException:不是对象引用   设置为对象的实例。

来源错误:

  

第36行:否则第37行:{第38行:
  rolesTable.InsertOnSubmit(作用); ins = true;第39行:}   第40行:

     

源文件:   C:\的Inetpub \ sklepomat \的DomainModel \混凝土\ SqlRolesRepository.cs
  行:38

堆栈追踪:

  

[NullReferenceException:对象引用未设置为的实例   对象。]
  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()+ 0102   System.Data.Linq.StandardChangeTracker.Track(MetaType mt,Object obj,   字典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实体)   +172 DomainModel.Concrete.SqlRolesRepository.SaveRole(角色角色)在C:\ inetpub \ sklepomat \ DomainModel \ Concrete \ SqlRolesRepository.cs:38
  DomainModel.Concrete.SklepomatRoleProvider.CreateRole(String roleName)   在   C:\的Inetpub \ sklepomat \的DomainModel \混凝土\ SklepomatRoleProvider.cs:71   System.Web.Security.Roles.CreateRole(String roleName)+73
  WebUI.Controllers.TempController.ble()in   C:\的Inetpub \ sklepomat \ WebUI中\ \控制器TempController.cs:29
  lambda_method(ExecutionScope,ControllerBase,Object [])+74
  System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase   controller,Object []参数)+17
  System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext   controllerContext,IDictionary 2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2   参数)+24
  System.Web.Mvc&LT;&GT; 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个过滤器,ActionDescriptor actionDescriptor,   IDictionary`2参数)+192
  System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext   controllerContext,String actionName)+399
  System.Web.Mvc.Controller.ExecuteCore()+ 1266   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&amp; completedSynchronously)+75

我认为这是因为EntitySet<User> _Users等于null ... 我对吗 !? 如果_Users不可以为空,应该分配给哪些人??

更新

引发异常

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

        }

将角色对象的字段设置为:

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

2 个答案:

答案 0 :(得分:4)

以下是与LINQ映射相关的精彩教程的链接:http://www.codeproject.com/KB/linq/linqtutorial.aspx我的最终代码是:

[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 :(得分:1)

您的代码和/或架构中存在问题。 Role.RoleID属性是您的主键,是一个可以为null的int类型。这不可能。主键值不能包含空值。