如何使用 Nhibernate ManyToMany添加记录?



我有一个演员和电影课。一个演员可以演很多电影,一部电影可以有很多演员。所以我写了这些类和映射

class Actor
{
public Actor()
{
Movies = new List<Movie>();
}
public virtual int ActorId { get; set; }
public virtual string ActorName { get; set; }
public virtual IList<Movie> Movies { get; set; }
}

class ActorMap : ClassMap<Actor>
{
public ActorMap ()
{
Id(x => x.ActorId).GeneratedBy.Identity();
Map(x => x.Name);
HasManyToMany(x => x.Movies)
.Cascade.All()
.Table("ActorMovies");
}
}

class Movie
{
public virtual Guid MovieId { get; set; }
public virtual string MovieName { get; set; }
public virtual IList<Actor> Actors { get; set; }
}

class MovieMap : ClassMap<Movie>
{
public MovieMap ()
{
Id(x => x.MovieId).GeneratedBy.GuidComb();
Map(x => x.Name);
HasManyToMany(x => x.Actors)
.Cascade.All()
.Inverse()
.Table("ActorMovies");
}
}

和数据库连接

public class Demo
{
private static ISessionFactory _sessionFactor;
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactor == null)
{
InitializeSessionFactory();
}
return _sessionFactor;
}
}
private static void InitializeSessionFactory()
{
_sessionFactor = Fluently.Configure()
.Database(MySQLConfiguration.Standard
.ConnectionString(
"Server=localhost;Database=movie;Uid=xx;Pwd=xx;"
))
.Mappings(mappings => mappings.FluentMappings
.AddFromAssemblyOf<Program>())
.BuildSessionFactory();
}
public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}

我被困在这一点上。如何添加演员和电影?在考虑创建演员时,应该已经有他/她扮演的电影,在这种情况下,如果我先添加电影,仍然会出现同样的问题,因为我需要演员。我是数据库操作的新手,如果答案很明显,我很抱歉。

class Program
{
static void Main(string[] args)
{
using var session = Demo.OpenSession();
using var transaction = session.BeginTransaction();
Actor actor = new Actor();
transaction.Commit();
}
}

你可以尝试这样的事情:

  1. 创建影片对象

    Movie killBill = new Movie {
    Name = "Kill Bill"
    };
    
  2. 创建角色对象

    Actor umaThurman = new Actor
    {
    Name = "Uma Thurman",
    };
    
  3. 在演员对象中,将
  4. 已创建的影片对象添加到影片中:

    umaThurman.Movies.Add(killBill);
    
  5. 在影片对象中,将
  6. 已创建的演员对象添加到演员中:

    killBill.Actors.Add(umaThurman);
    
  7. 再说下一个演员:

    Actor davidCarradine = new Actor
    {
    Name = "David Carradine",
    };
    davidCarradine.Movies.Add(killBill);
    killBill.Actors.Add(davidCarradine);
    
  8. 只需使用会话的 save 方法传递 killBill 电影对象(保存一次,NHibernate 将完成所有操作,它将保存 killBill 电影对象和以两种方式关联的演员:有演员的电影和有电影的演员(:

    session.Save(killBill);
    
  9. 然后提交: 交易。提交((;

PS.:不要忘记初始化演员和电影类中的列表:

// Actor Class
public virtual IList<Movie> Movies { get; set; } = new List<Movie>();
// Movie Class
public virtual IList<Actor> Actors { get; set; } = new List<Actor>();

最新更新