0

エラーの正確な理由を突き止めようとして、何日もこの混乱に苦しんでいます。一言、失敗!基本的に、私は別の を参照ClassMapするいくつかで書いた a を単体テストしようとしています。referencereference

    [TestMethod]
    public void IssueReturnRegisterMap_Create_Success()
    {
        var maxDifference = TimeSpan.FromMilliseconds(990);
        BookSize sz = new BookSize() { ID = "1", Name = "A" };
        Department dpt = new Department() { ID = "1", Name = "Philosophy" };
        Author auth = new Author() { ID = "2", FirstName = "Wise", LastName = "Person" };
        Publisher pub = new Publisher() { ID = "1", Name = "Pub1", Address = "Address 1" };
        Language lang = new Language() { ID = "1", Name = "Lang1" };
        Patron ptrn = new Patron()
        {
            ID = "1",
            FirstName = "First",
            LastName = "Last",
            Age = 82,
            Address = "Address1",
            Gender = "Male",
            Occupation = "Occupation1",
            Telephone1 = "01234567890",
            Telephone2 = "01234567890"
        };

        Book book = new Book()
        {
            ID = "1",
            Name = "Book1",
            Number = "12",
            BookSize = sz,
            Department = dpt,
            Author = auth,
            Commentator = "Another wiseman",
            Publisher = pub,
            Language = lang,
        };
        Member member = new Member()
        {
            ID = "1",
            Patron = ptrn,
            IsRegistered = true
        };

        //Edit: Acc. to Firo's suggestion
        Database.Session.Save( sz );
        Database.Session.Save( dpt );
        Database.Session.Save( auth );
        Database.Session.Save( lang );
        Database.Session.Save( pub );
        Database.Session.Save( ptrn );
        Database.Session.Save( book ); //@Firo: Throws same exception here! :-(
        Database.Session.Save( member );

        new PersistenceSpecification<IssueReturnEntry>( Database.Session, new CustomEqualityComparer() )
        .CheckProperty( x => x.ID, "1" )
        .CheckReference( x=> x.Book, book )
        .CheckReference( x => x.Member, member )
        .CheckProperty( x => x.IssuedBy, "Librarian" )
        .CheckProperty( x => x.IssueDate, DateTime.Now, new DateTimeEqualityComparer( maxDifference ) )
        .CheckProperty( x => x.DueDate, DateTime.Now, new DateTimeEqualityComparer( maxDifference ) )
        .CheckProperty( x => x.ReturnDate, DateTime.Now, new DateTimeEqualityComparer( maxDifference ) )
        .CheckProperty( x => x.ReturnBy, "User" )
        .VerifyTheMappings();
    }

BookmyがreferenceslikeなどでできていることがはっきりとわかるようBookSizeに、それ自体がforマップになります。についても同様です。オブジェクトに対して「null 以外のプロパティが null または一時的な値のエラーを参照しています」という例外がスローされます。どんな助けでも大歓迎です。前もって感謝します。DepartmentBookreferencesIssueReturnRegisterMemberBookSize

4

3 に答える 3

0

私のBookMapとは次のとおりであり、その後、そのような例外なしで合格するエンティティを使用しBookSizeMapて単体テストに従います (注意してください、私はすでにエンティティの単体テストに従って実行しようとしましたが、エンティティでは機能しませんでした.BookPersistenceSpecificationBookIssueRegisterEntry

public class BookMap : ClassMap<Book>
{
    public BookMap()
    {
        Id(x => x.ID);
        Map(x => x.Name);
        References(x => x.BookSize)
        .Column("SizeID");
        References(x => x.Department)
        .Column("DepartmentID");
        Map(x => x.Number);
        Map(x => x.Edition);
        Map(x => x.CopyNumber);
        References(x => x.Author)
        .Column("AuthorID");
        Map(x => x.Commentator);
        References(x => x.Publisher)
        .Column("PublisherID");
        References(x => x.Language)
        .Column("LanguageID");
        Map(x => x.Cupboard);
        Map(x => x.IsIssued);
        Map(x => x.IsDeleted);
        Table("Books");
    }
}

public class BookSizeMap : ClassMap<BookSize>
{
    public BookSizeMap()
    {
        Id(x => x.ID);
        Map(x => x.Name);
        Map(x => x.Length);
        Map(x => x.Width);
    }
}

    [TestMethod]
    public void BookMapping_Create_Success()
    {
        new PersistenceSpecification<Book>( Database.Session, new CustomEqualityComparer() )
        .CheckProperty(x => x.ID, "1")
        .CheckProperty(x => x.Name, "My Experiments with Truth")
        .CheckReference(x => x.BookSize, new BookSize() { ID = "2", Name = "A" })
        .CheckReference(x => x.Department, new Department() { ID = "3", Name = "Autobiography" })
        .CheckProperty(x => x.Number, "ABG.a.1")
        .CheckProperty(x => x.Edition, "12")
        .CheckProperty(x => x.CopyNumber, "13")
        .CheckReference(x => x.Author, new Author() { ID = "4", FirstName = "Mohandas", LastName = "Gandhi" })
        .CheckProperty(x => x.Commentator, "Comm1")
        .CheckReference(x => x.Publisher, new Publisher() { ID = "5", Name = "ABC", Address = "XYZ" })
        .CheckReference(x => x.Language, new Language() { ID = "6", Name = "Lang1" })
        .CheckProperty(x => x.IsIssued, true)
        .CheckProperty(x => x.IsDeleted, false)
        .VerifyTheMappings();
    }
于 2013-08-13T14:53:37.063 に答える
0

このエラーは、保存するエンティティによって Booksize が参照されていますが、それ自体は保存されておらず、カスケードが無効になっているため、このアクションで保存できないことを意味します。

そうするか

  • References(x => x.BookSize).Cascade.All()マッピングまたは
  • Database.Session.Save(bz)走る前にPersistenceSpecification

他のすべての参照エンティティと同じ

更新: 永続エンティティには、ID を考慮した Equals メソッドが必要です

public override bool Equals(object obj)
{
    var other = obj as BookSize;
    return other != null && (Id == 0) ? ReferenceEquals(this, other) : Id == other.Id;
}

private int? _hashcode;
public override int GetHashCode()
{
    return _hashcode.HasValue ? _hashcode.Value : _hashcode = Id;
}
于 2013-07-26T15:40:04.347 に答える
0

申し訳ありませんフィーロ、私の返信が十分に読めなかったと思うので、ここにもう一度投稿します。

if (x is BookSize && y is BookSize)
{ 
return (((BookSize)x).ID == ((BookSize)y).ID) && (((BookSize)x).Name == ((BookSize)y).Name) && (((BookSize)x).Length == ((BookSize)y).Length) && (((BookSize)x).Width == ((BookSize)y).Width);
}

これは、EqualityComparer 用に取得した equals メソッドです。GetHashCode メソッドはまだありません。

于 2013-07-31T20:09:10.927 に答える