【问题标题】:LINQ - Association mapping - Null reference on InsertOnSubmitLINQ - 关联映射 - InsertOnSubmit 上的空引用
【发布时间】:2010-01-24 01:04:58
【问题描述】:

我有一个表 Role 与我的数据库中的表 User 以一对多的关系关联。我手动创建了 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 用户不能为空,所以如果晚于我希望创建新角色:

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 行:
角色表.InsertOnSubmit(角色); ins =真;第 39 行:} 第 40 行:

源文件: C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs
线路:38

堆栈跟踪:

[NullReferenceException: 对象引用未设置为 对象。]
System.Data.Linq.Mapping.EntitySetDefSourceAccessor2.GetValue(T instance) +15
System.Data.Linq.Mapping.MetaAccessor
2.GetBoxedValue(对象实例) +44 System.Data.Linq.StandardTrackedObject.HasDeferredLoader(MetaDataMember deferredMember) +90
System.Data.Linq.StandardTrackedObject.get_HasDeferredLoaders() +102
System.Data.Linq.StandardChangeTracker.Track(元类型 mt,对象 obj, Dictionary2 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 C:\inetpub\sklepomat\DomainModel\Concrete\SqlRolesRepository.cs:38 中的 DomainModel.Concrete.SqlRolesRepository.SaveRole(角色角色)
DomainModel.Concrete.SklepomatRoleProvider.CreateRole(String roleName) 在 C:\inetpub\sklepomat\DomainModel\Concrete\SklepomatRoleProvider.cs:71 System.Web.Security.Roles.CreateRole(String roleName) +73
WebUI.Controllers.TempController.ble() 在 C:\inetpub\sklepomat\WebUI\Controllers\TempController.cs:29
lambda_method(ExecutionScope , ControllerBase , Object[] ) +74
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase 控制器,Object[] 参数)+17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext 控制器上下文,IDictionary2 parameters) +178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 参数)+24
System.Web.Mvc.c__DisplayClassa.b__7() +52 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter 过滤器,ActionExecutingContext preContext,Func1 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 控制器上下文,字符串 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

我认为这是因为 EntitySet&lt;User&gt; _Users 等于 null... 我对吗 !? 如果_Users 不能为空!应该分配什么?

更新:

引发异常

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

        }

角色对象的字段设置为:

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

【问题讨论】:

    标签: c# .net linq exception nullreferenceexception


    【解决方案1】:

    这是与 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);}
            }
    }
    

    【讨论】:

    • private EntitySet&lt;User&gt; _Users = new EntitySet&lt;User&gt;(); - 为我工作
    • 如果它描述了您解决问题的方式,您应该接受您自己的答案。
    【解决方案2】:

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

    【讨论】:

    • 它被更改为可为空,因为 RoleID 是在数据库中生成的,所以我认为我不能传递任何值,这就是错误的原因。我已将其改回常规 int 类型,但它不能解决问题...(请参阅更新)
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多