0 votes

Fluent NHibernate/Problème de requête d'insertion SQL Server 2008

Je suis nouveau dans Fluent NHibernate et je rencontre un problème.

J'ai un mappage défini comme suit:

public PersonMapping()
    {
        Id(p => p.Id).GeneratedBy.HiLo("1000");
        Map(p => p.FirstName).Not.Nullable().Length(50);

        Map(p => p.MiddleInitial).Nullable().Length(1);

        Map(p => p.LastName).Not.Nullable().Length(50);
        Map(p => p.Suffix).Nullable().Length(3);
        Map(p => p.SSN).Nullable().Length(11);
        Map(p => p.BirthDate).Nullable();
        Map(p => p.CellPhone).Nullable().Length(12);
        Map(p => p.HomePhone).Nullable().Length(12);
        Map(p => p.WorkPhone).Nullable().Length(12);
        Map(p => p.OtherPhone).Nullable().Length(12);
        Map(p => p.EmailAddress).Nullable().Length(50);
        Map(p => p.DriversLicenseNumber).Nullable().Length(50);

        Component

Mon test est

    [Test]
    public void can_correctly_map_Person_with_Addresses()
    {
        var myPerson = new Person("Jane", "", "Doe");
        var priorAddresses = new[]
        {   
            new PreviousAddress(ObjectMother.GetAddress1(), DateTime.Parse("05/13/2010")),
            new PreviousAddress(ObjectMother.GetAddress2(), DateTime.Parse("05/20/2010"))
        };

        new PersistenceSpecification(Session)
            .CheckProperty(c => c.FirstName, myPerson.FirstName)
            .CheckProperty(c => c.LastName, myPerson.LastName)
            .CheckProperty(c => c.MiddleInitial, myPerson.MiddleInitial)
            .CheckList(c => c.PriorAddresses, priorAddresses)

            .VerifyTheMappings();
    }

GetAddress1() (oui, nom horrible) a Line2 == null

Les tables semblent être créées correctement dans sql server 2008, mais le test échoue avec une SQLException "String or binary data would be truncated." Lorsque je capture l'instruction SQL dans SQL Profiler, je reçois

exec sp_executesql N'INSERT INTO PriorAddress (Line1, Line2, City, State, Zip, 
EndEffectiveDate, Id) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6)',N'@p0 
nvarchar(18),@p1 nvarchar(4000),@p2 nvarchar(10),@p3 nvarchar(2),@p4 nvarchar(5),@p5 
datetime,@p6 int',@p0=N'6789 Somewhere Rd.',@p1=NULL,@p2=N'Hot 
Coffee',@p3=N'MS',@p4=N'09876',@p5='2010-05-13 00:00:00',@p6=1001

Remarquez que le paramètre @p1 est défini en nvarchar(4000) et reçoit une valeur NULL.

Pourquoi le paramètre est-il défini en nvarchar(4000)? Comment puis-je le résoudre?

Merci!

Ma première théorie selon laquelle cela était lié au paramètre Line2 était fausse. J'ai ajouté une valeur à Line2, relancé le test, et je reçois toujours la même erreur.

exec sp_executesql N'INSERT INTO PriorAddress 
       (Line1, Line2, City, State, Zip, EndEffectiveDate, Id) 
VALUES (@p0,   @p1,   @p2,   @p3,  @p4, @p5,              @p6)',
N'@p0 nvarchar(18),@p1 nvarchar(6),@p2 nvarchar(10),@p3 nvarchar(2),@p4 
nvarchar(5),@p5 datetime,@p6 int',
@p0=N'6789 Somewhere Rd.',
@p1=N'A test',
@p2=N'Hot Coffee',
@p3=N'MS',
@p4=N'09876',
@p5='2010-05-13 00:00:00',
@p6=1001

3voto

Mark Points 31

Désolé, je suis idiot. J'ai compris. Le code postal devrait probablement avoir une longueur supérieure à 2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X