Проблема удаления при использовании беглого nhibernate в MVC 3 - PullRequest
0 голосов
/ 08 июля 2011

У меня есть имя слоя MVCTemplate.Common, имеющее две папки Entities и Mappings. В сущностях User.cs и Role.cs указано ниже:

using System;
using System.Collections.Generic;

namespace MVCTemplate.Common.Entities
{
    public class User
    {
        public virtual Guid UserID { get; set; }
        public virtual string UserName { get; set; }
        public virtual string Password { get; set; }
        public virtual string FullName { get; set; }
        public virtual string Email { get; set; }
        public virtual TimeSpan LastLogin { get; set; }
        public virtual bool IsActive { get; set; }
        public virtual DateTime CreationDate { get; set; }
        public virtual IList<Role> UserInRoles { get; set; }

        public User()
        {
            UserInRoles = new List<Role>();
        }
    }
}

using System.Collections.Generic;

namespace MVCTemplate.Common.Entities
{
    public class Role
    {
        public virtual int? RoleID { get; set; }
        public virtual string RoleName { get; set; }
        public virtual bool IsActive { get; set; }
        public virtual string Description { get; set; }
        public virtual IList<User> Users { get; set; }
        //public virtual IList<RolePermission> RolePermission { get; set; }

        public Role()
        {
            Users = new List<User>();
        }

        public virtual void AddUsers(User _user)
        {
            _user.UserInRoles.Add(this);
            Users.Add(_user);
        }
    }
}

Теперь, в папке Mappings их файлы отображений находятся под:

using FluentNHibernate.Mapping;
using MVCTemplate.Common.Entities;

namespace MVCTemplate.Common.Mappings
{
   public class RoleMap : ClassMap<Role>
    {
        public RoleMap()
        {
            Table("tblRoles");
            Id(role => role.RoleID).GeneratedBy.Identity();
            Map(role => role.RoleName).Not.Nullable();
            Map(role => role.IsActive).Not.Nullable();
            Map(role => role.Description).Not.Nullable();
            HasManyToMany(role => role.Users).Cascade.All().Table("tblUserInRoles");
            //HasMany(role => role.User);
            //HasMany(role => role.RolePermission);
        }
    }
}

using FluentNHibernate.Mapping;
using MVCTemplate.Common.Entities;

namespace MVCTemplate.Common.Mappings
{
    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("tblUsers");
            Id(user => user.UserID).GeneratedBy.Guid();
            Map(user => user.UserName).Not.Nullable();
            Map(user => user.Password).Not.Nullable();
            Map(user => user.FullName).Not.Nullable();
            Map(user => user.Email).Not.Nullable();
            //Map(user => user.LastLogin).Nullable();
            Map(user => user.IsActive).Not.Nullable();
            Map(user => user.CreationDate).Not.Nullable();
            HasManyToMany(user => user.UserInRoles).Cascade.All().Table("tblUserInRoles");
            //HasMany(user => user.UserInRoles);
        }
    }
}

Теперь из контроллера я получил конкретный пользовательский объект в пользовательском объекте и теперь хочу удалить его, простой код такой:

using System;
using System.Collections.Generic;
using System.Web.Mvc;
using MVCTemplate.BussinessLayer.Facade;
using MVCTemplate.Common.Entities;

namespace MVCTemplate.Web.Controllers
{
    public class HomeController : Controller
    {

        private UserManagement _userManagement;
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";

            _userManagement = new UserManagement();
            var oUser = _userManagement.GetUserBy(new Guid("4fb5856a-58d9-4b78-8d08-bce645bc93c7"));

            oUser.UserInRoles = new List<Role>();
            _userManagement.Delete(oUser);

            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }
}

Теперь я просто хочу удалить этого пользователя, так как этот пользователь не существует ни в одной роли, и в его соединении нет записи table(UserInRole). Я инициализирую его коллекцию ролей как пустую для Count=0, но после вызова метода удаления он выдает ошибку с sqlQuery, как указано ниже:

не удалось удалить коллекцию: [MVCTemplate.Common.Entities.User.UserInRoles # 4fb5856a-58d9-4b78-8d08-bce645bc93c7] [SQL: DELETE FROM tblUserInRoles WHERE User_id = @ p0]

Обратите внимание, что в Соединительной таблице tblUserInRole нет поля с таким именем User_id, как указано в ошибке, из-за чего во внутреннем исключении указывается, что имя столбца User_id не существует. Но в соединительной таблице у меня есть только два поля: 1) UserID и 2) RoleID.

Есть предложения, как ее решить?

1 Ответ

0 голосов
/ 13 июля 2011

выглядит для меня как ошибка отображения. Изменения:

HasManyToMany(user => user.UserInRoles).Cascade.All().Table("tblUserInRoles");

Для

HasManyToMany(user => user.UserInRoles)
    .Cascade.All()
    .Table("tblUserInRoles")
    .ParentKeyColumn("UserID")
    .ChildKeyColumn("RoleID");
...