1

我想创建我的第一个nhibernate应用程序。当我运行程序命令窗口打开并创建数据库表时。但是,向Team表插入新行的事务失败,并显示错误“Invalid Cast(检查属性类型不匹配的映射);”在session.Save(Team);行中的program.cs文件中发生错误。任何人都可以帮助找出为什么发生这种情况?任何帮助,将不胜感激。这里是我的代码需要帮助通过使用流畅的nhibernate将行插入表

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; 
     } 

    } 
} 

的Program.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(); 
     } 
    } 
} 
+0

检查* Team * SQL表列的类型,以验证它们中的任何一个是否使用Team类中的不同类型定义。错误告诉你这个消息。 – HuorSwords

+0

你还可以提供关于“团队”表的详细信息。这是你的问题所在。 – Suhas

回答

1

乍一看一两件事,是不正确是宣言所述玩家教练员性质的离子:

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自己的收藏集。