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