需要帮助使用fluent nhibernate将行插入表中

本文关键字:插入 nhibernate fluent 帮助 | 更新日期: 2023-09-27 18:22:28

我正在尝试创建我的第一个nhibernate应用程序。当我运行程序时,命令窗口打开并创建数据库表。但是,将新行插入Team表的事务失败,错误为"Invalid Cast(请检查映射中的属性类型是否不匹配);"行会话中的program.cs文件中出现错误。保存(团队);。有人能帮忙找出为什么会发生这种事吗?任何帮助都将不胜感激。这是我的代码

Player.cs

namespace BDB.Entities
{
    public class Player
    {
        public virtual int Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual string Surname { get; set; }
        public virtual string Birthdate { get; set; }
        public virtual string Position { get; set; }
        public virtual int Salary { get; set; }
        public virtual Team Team { get; set; }
    }
}

PlayerMap.cs

namespace BDB.Mappings
{
    public class PlayerMap : ClassMap<Player>
    {
        public PlayerMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            Map(x => x.Surname);
            Map(x => x.Birthdate);
            Map(x => x.Position);
            Map(x => x.Salary);
            References(x => x.Team);
        }
    }
}

Team.cs

namespace BDB.Entities
{
    public class Team
    {
        public virtual int Id { get; protected set; }
        public virtual string Country { get; set; }
        public virtual string City { get; set; }
        public virtual string Title { get; set; }
        public virtual string Website { get; set; }
        public virtual int Budget { get; set; }
        public virtual List<Player> Players { get; set; }
        public virtual List<Coach> Coaches { get; set; }
        public Team()
        {
            Players = new List<Player>();
            Coaches = new List<Coach>();
        }
        public virtual void AddPlayer(Player player)
        {
            player.Team = this;
            Players.Add(player);
        }
        public virtual void AddCoach(Coach coach)
        {
            coach.Team = this;
            Coaches.Add(coach);
        }
    }
}

TeamMap.cs

namespace BDB.Mappings
{
    public class TeamMap : ClassMap<Team>
    {
        public TeamMap()
        {
            Id(x => x.Id);
            Map(x => x.Country);
            Map(x => x.City);
            Map(x => x.Title);
            Map(x => x.Budget);
            Map(x => x.Website);
            HasMany(x => x.Players)
                .Inverse()
                .Cascade.All();
            HasMany(x => x.Coaches)
                .Inverse()
                .Cascade.All();
        }
    }
}

Coach.cs

namespace BDB.Entities
{
    public class Coach
    {
        public virtual int Id { get; protected set; }
        public virtual string Name { get; set; }
        public virtual string Surname { get; set; }
        public virtual int Experience { get; set; }
        public virtual int Salary { get; set; }
        public virtual Team Team { get; set; }
    }
}

CoachMap.cs

namespace BDB.Mappings
{
    public class CoachMap : ClassMap<Coach>
    {
        public CoachMap()
        {
            Id(x => x.Id);
            Map(x => x.Name);
            Map(x => x.Surname);
            Map(x => x.Experience);
            Map(x => x.Salary);
            References(x => x.Team);
        }
    }
}

SessionFactory.cs

namespace BDB
{
    public class SessionFactory
    {
        public static ISessionFactory ConfigureSystem()
        {
            var connString = "server=.''SQLEXPRESS;database=litest;integrated security=SSPI;";
            var configuration = Fluently.Configure()
                .Database(MsSqlConfiguration
                .MsSql2008
                .ConnectionString(connString)
                    .ShowSql
                )
                .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<Team>()
                .AddFromAssemblyOf<Player>()
                .AddFromAssemblyOf<Coach>()) 
                .BuildConfiguration();
            var exporter = new SchemaExport(configuration);   
            exporter.Execute(true, true, false);
            ISessionFactory sessionFactory = configuration.BuildSessionFactory();
            return sessionFactory;
        }
    }
}

程序.cs

namespace BDB
{
    class Program
    {
        static void Main(string[] args)
        {
            ISessionFactory sessionFactory = SessionFactory.ConfigureSystem();
            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Team Team = new Team { Country = "lt", City = "kau", Title = "Zal", Budget = 10000, Website = "www.kz.lt" };
                    session.Save(Team);
                    transaction.Commit();
                }
            }
            Console.ReadKey();
        }
    }
}

需要帮助使用fluent nhibernate将行插入表中

乍一看,有一件事是不正确的,那就是球员教练属性的声明:

public virtual List<Player> Players { get; set; }
public virtual List<Coach> Coaches { get; set; }

问题是它们都使用混凝土类型List<>。NHibernate在管理实体时使用自己的集合类型,因此除了原始列表之外,它还必须能够使用这些集合类型(因为它使用具有更改跟踪功能的集合等等)。将声明更改为:

public virtual ICollection<Player> Players { get; set; }
public virtual ICollection<Coach> Coaches { get; set; }

请注意,这些接口仍然接受List<>,但也可以包含私有的NHibernate自己的集合。