需要帮助使用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();
}
}
}
乍一看,有一件事是不正确的,那就是球员和教练属性的声明:
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自己的集合。