LINQ - сопоставление ассоциации - нулевая ссылка на InsertOnSubmit - PullRequest
0 голосов
/ 24 января 2010

Роль таблицы связана с отношением 1-многие к таблице 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;
    }
}

Я получаю сообщение об ошибке, указанное ниже:

Ссылка на объект не установлена ​​для экземпляра объекта. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: 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<br> 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 (MetaType mt, Object obj, Словарь 2 visited, Boolean recurse, Int32 level) +187<br> 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 () в C: \ Inetpub \ sklepomat \ WebUI \ Контроллеры \ TempController.cs: 29
lambda_method (ExecutionScope, ControllerBase, Object []) + 74
System.Web.Mvc.ActionMethodDispatcher.Execute (ControllerBase контроллер, параметры Object []) + 17
System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary 2 parameters) +178<br> 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, фильтры Func 1 continuation) +254<br> 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 () + 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, логический и завершен синхронно) + 75

Полагаю, это потому, что EntitySet<User> _Users равно null ... Я прав !? Что следует присвоить _Users, если он не может быть обнуляем!?

UPDATE:

Исключение повышено

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

        }

Где поля объекта роли установлены в:

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

Ответы [ 2 ]

4 голосов
/ 24 января 2010

Вот ссылка на отличный учебник, связанный с отображением 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 голос
/ 24 января 2010

У вас есть проблема в вашем коде и / или схеме. Свойство Role.RoleID, которое является вашим первичным ключом, имеет тип int, допускающий значение NULL. Этого не может быть. Значения первичного ключа не могут содержать нулевые значения.

...