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

C# LINQ-关联映射-InsertOnSubmit上的空引用,c#,.net,linq,exception,nullreferenceexception,C#,.net,Linq,Exception,Nullreferenceexception,我的数据库中有一个与表用户以1-many关系关联的表角色。我已经手动创建了LINQ映射类: [Table(Name="Role")] public class Role { private EntitySet<User> _Users; [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] public int RoleID { get; set;

我的数据库中有一个与表用户以1-many关系关联的表角色。我已经手动创建了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);}
    }
}
我收到下面列出的错误消息:

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

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

源错误:

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

源文件: C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs
电话号码:38

堆栈跟踪:

[NullReferenceException:对象引用未设置为 对象。]
System.Data.Linq.Mapping.EntitySetDefSourceAccessor
2.GetValue(T
实例)+15
System.Data.Linq.Mapping.MetaAccessor
2.GetBoxedValue(对象实例) +44 System.Data.Linq.StandardTrackeObject.HasDeferredLoader(MetaDataMember 延期成员)+90
System.Data.Linq.StandardTrackedObject.get\u HasDeferredLoaders()+102
System.Data.Linq.StandardChangeTracker.Track(元类型mt,对象obj, 字典
2已访问,布尔递归,Int32级别)+187
System.Data.Linq.StandardChangeTracker.Track(对象对象对象,布尔值 递归)+80系统。数据。Linq.StandardChangeTracker.Track(对象 obj)+9系统数据Linq.表
1.InsertOnSubmit(实体) +172 C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs中的DomainModel.Concrete.SqlRolesRepository.SaveRole(Role-Role) DomainModel.Concrete.SklePomatrolProvider.CreateRole(字符串roleName) 在里面 C:\inetpub\sklepomat\DomainModel\Concrete\SklepomatRoleProvider.cs:71 System.Web.Security.Roles.CreateRole(字符串roleName)+73
中的WebUI.Controllers.TempController.ble() C:\inetpub\sklepomat\WebUI\Controllers\TempController.cs:29
lambda_方法(ExecutionScope、ControllerBase、Object[])+74
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,对象[]参数)+17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary
2参数)+178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor ActionDescriptor,IDictionary
2 参数)+24
System.Web.Mvc.c_;u DisplayClassa.b__;u 7() +52 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext预文本,Func
1 continuation)+254
System.Web.Mvc.c__显示类c.b__9() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext,IList
1过滤器,ActionDescriptor ActionDescriptor, IDictionary`2参数)+192
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext,字符串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(请求上下文 请求上下文)+7
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步骤,布尔值&同步完成)+75

我假设这是因为
EntitySet\u Users
等于
null
。。。 我说得对吗!? 如果不能通过nullable!将什么分配给
\u用户

更新:

提出了例外情况

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

        }
其中角色对象的字段设置为:

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

您的代码和/或架构有问题。作为主键的Role.RoleID属性是可为null的int类型。这不可能。主键值不能包含空值。

您的代码和/或架构有问题。作为主键的Role.RoleID属性是可为null的int类型。这不可能。主键值不能包含空值。

这里有一个链接,指向与LINQ映射相关的优秀教程:我的最终代码是:

[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);}
        }
}
[表(Name=“Role”)]
公共阶级角色
{
私有EntitySet _Users=新EntitySet();
[列(IsPrimaryKey=true,IsDbGenerated=true,AutoSync=AutoSync.OnInsert)]
public int RoleID{get;set;}
[列]公共字符串名称{get;set;}
[关联(Name=“FK\u User\u Role”,Storage=“\u Users”,ThisKey=“RoleID”,OtherKey=“RoleID”)]
公共实体集用户
{
获取{返回此。\u用户;}
设置{this._Users.Assign(value);}
}
}

这里有一个链接,指向与LINQ映射相关的优秀教程:我的最终代码是:

[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);}
        }
}
[表(Name=“Role”)]
公共阶级角色
{
私有EntitySet _Users=新EntitySet();
[列(IsPrimaryKey=true,IsDbGenerated=true,AutoSync=AutoSync.OnInsert)]
public int RoleID{get;set;}
[列]公共字符串名称{get;set;}
[关联(Name=“FK\u User\u Role”,Storage=“\u Users”,ThisKey=“RoleID”,OtherKey=“RoleID”)]
公共实体集用户
{
获取{返回此。\u用户;}
设置{this._Users.Assign(value);}
}
}

它被更改为nullable,因为RoleID是在数据库中生成的,所以我认为我无法传递任何值,这就是错误的原因。我已经把它改回了常规的int类型,但它并没有解决这个问题。。。(见更新)它