4

頭痛の種になる単純な Fluent-NHibernate マッピングがあります。エンティティの 1 つのディクショナリをマップしようとしていますが、その FK は null のままです。

エンティティのコードは次のとおりです。

public class Person
{
    public Person()
    {
        PhoneNumbers = new Dictionary<string, Phone>();
    }

    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IDictionary<string, Phone> PhoneNumbers { get; set; }
}

public class Phone
{
    public virtual int Id { get; set; }
    public virtual string Type { get; set; }
    public virtual string Number { get; set; }
}

さて、マッピングは次のとおりです。

public class PersonClassMap : ClassMap<Person>
{
    public PersonClassMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Name);
        HasMany(x => x.PhoneNumbers).AsMap(y => y.Type).Cascade.All();
    }
}

public class PhoneClassMap : ClassMap<Phone>
{
    public PhoneClassMap()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        Map(x => x.Type);
        Map(x => x.Number);
    }
}

最後に、私が行っているテストは次のとおりです。

    static void Main(string[] args)
    {
        ConfigureSessionFactory();

        using (var session = _sessionFactory.OpenSession())
        {
            var john = new Person();
            john.Name = "John";

            Phone home = new Phone
                             {
                                 Type = "Home",
                                 Number = "12345"
                             };

            john.PhoneNumbers.Add(home.Type, home);

            session.Save(john);
        }
    }

なんらかの理由で、データベースを調べると、電話番号のレコードPerson_idは null のままであり、DB から人物をロードすると、PhoneNumbers辞書は空のままです。

なんで?そして、この問題を解決するにはどうすればよいですか?私は何を間違ってマッピングしていますか?

4

1 に答える 1

0

この問題は、トランザクションを追加することで最終的に解決されました。なぜそれが機能するのかはわかりませんが(実際には非常に悲しいことです)、機能します。

using (var session = _sessionFactory.OpenSession())
{
    var transaction = session.BeginTransaction();
    john.Name = "John";

    Phone home = new Phone
                     {
                         Type = "Home",
                         Number = "12345"
                     };
     john.PhoneNumbers.Add(home.Type, home);
     session.Save(john);
     transaction.Commit();
}

これを正しく理解するのに 3 時間かかりすぎたので、それがあなたにも役立つことを願っています。

于 2012-12-06T11:54:38.753 に答える