1

システム内のクラスのユーザーマッピングがあります。これらのユーザーは互いに友達になることができるため、各ユーザーには友達のユーザーのリストがありますが、作成すると、友達のテーブルや列がありません。作成さFriendListれたUserテーブルにあります。

public class User
{
    public User()
    {

        Games = new List<Game>();
        Stats = new UserStats { Rating = 1500 };
    }

    public User(string username, string password)
    {
        Username = username;
        Password = password;
        Games = new List<Game>();
        FriendList = new List<User>();
        Stats = new UserStats { Rating = 1500 };
    }

    public virtual int Id { get; set; }
    public virtual string Username { get; set; }
    public virtual string Password { get; set; }
    public virtual IList<Game> Games { get; set; }
    public virtual UserStats Stats { get; set; }
    public virtual IList<User> FriendList { get; set; } 
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id)
            .Column("UserId")
            .GeneratedBy
            .HiLo("100");
        Map(x => x.Username)
            .Not.Nullable();
        Map(x => x.Password)
            .Not.Nullable();
        HasMany(x => x.Games)
            .Cascade.All();
        References(x => x.Stats)
            .Not.Nullable()
            .Cascade.All();
        HasMany(x => x.FriendList)
            .Cascade.All();
    }
}

代わりに、これらの設定で友好的にする必要がありますか?

public class FriendConnection
{
    public int Id;
    public int Friend1ID;
    public int Friend2ID;
}

または、この他の設定を機能させることはできますか?

これは私が使用しているセッションファクトリです

public class SessionFactory
{
    private static readonly string ConnString = System.Configuration.ConfigurationManager.ConnectionStrings["MySQLConnectionString"].ConnectionString;

    private static ISessionFactory _session;
    private static readonly object SyncRoot = new Object();

    private static ISessionFactory CreateSessionFactory()
    {
        return Fluently.Configure()
            .Database(MySQLConfiguration
            .Standard
            .ConnectionString(ConnString))
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<UserMap>())
                .ExposeConfiguration(UpdateSchema)
                .BuildSessionFactory();
    }
    //
    private static void UpdateSchema(Configuration cfg)
    {
        new SchemaUpdate(cfg).Execute(false, true);
    }

    public static ISession Session
    {
        get
        {
            if (_session == null)
            {
                lock (SyncRoot)
                {
                    if (_session == null)
                        _session = CreateSessionFactory();
                }
            }
            return _session.OpenSession();
        }
    }

    private ISessionFactory CreateTables()
    { 
        return Fluently.Configure()
            .Database(MySQLConfiguration
            .Standard
            .ConnectionString(ConnString))
            .Mappings(m => m.FluentMappings
                .AddFromAssemblyOf<UserMap>())
                .BuildSessionFactory();
    }

    private static void ExportSchema(Configuration cfg)
    {
        var schemaexport = new SchemaExport(cfg);
        schemaexport.Drop(false, true);
        schemaexport.Create(false, true);

    }

    public ISession OpenCreateTablesSession()
    {

        _session = _session ?? (_session = CreateTables());

        return _session.OpenSession();
    }
}
4

2 に答える 2

1

パラメータなしのコンストラクタは、フレンドリストをインスタンス化しません

public User()
{
    Games = new List<Game>();
    Stats = new UserStats { Rating = 1500 };
    FriendList = new List<User>(); // <<<--- missing
 }
于 2013-01-12T13:37:29.407 に答える
1

任意のユーザーが任意のユーザーの友達になる可能性がある場合は、ManyToManyマッピングが必要になります。

HasManyToMany(x => x.FriendList)
    .Table("FriendConnection")
    .ParentKeyColumn("Friend1ID")
    .ChildKeyColumn("Friend2ID");

中間者としてのC#エンティティは必要ありません。

ただし、問題は、そのようなフレンドのリストに親所有者としての現在のインスタンスがあることです。したがって、私は(ユーザーとして)リレーションを(として)所有しています。言い換えれば、私は他の参照の子でもある可能性があります。childそのため、ユーザーは、現在のインスタンスが役割を果たすFriendsのコレクションも持っている必要があります。

HasManyToMany(x => x.FriendList2)
    .Table("FriendConnection")
    .ParentKeyColumn("Friend2ID")
    .ChildKeyColumn("Friend1ID");  // reversed mapping

ユーザーは次のように拡張する必要があります。

public virtual IList<User> FriendList { get; set; }
public virtual IList<User> FriendList2 { get; set; }
于 2013-01-12T13:46:27.613 に答える