schotime / NPoco

Simple microORM that maps the results of a query onto a POCO object. Project based on Schotime's branch of PetaPoco
Apache License 2.0
847 stars 301 forks source link

NPOCO Does not map Composite Primary Key #702

Closed ccasalicchio closed 2 months ago

ccasalicchio commented 2 months ago

NPOCO version 5.7.1

This is the class:

        [TableName(TABLE_NAME)]
        [ExplicitColumns]
        [PrimaryKey("id,name", AutoIncrement = false)]
        public class GroupDetails
        {
            public const string TABLE_NAME = $"member{nameof(GroupDetails)}";
            [Column("id")]
            public int Id { get; set; }
            [Column("name")]
            public string Name { get; set; } = string.Empty;
            [Column("description")]
            public string? Description { get; set; }
            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            [Column("logo")]
            public string Logo { get; set; } = string.Empty;
            [Column("data")]
            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            public string Data { get; set; } = string.Empty;
        }

Yet, when the table is created, the composite primary key is not applied. Am I doing something wrong? image

If I try using this syntax, the composite key is created, but then I get this error when trying to save a new row:

        [TableName(TABLE_NAME)]
        [ExplicitColumns]
        public class GroupDetails
        {
            public const string TABLE_NAME = $"member{nameof(GroupDetails)}";
            [Column("id")]
            [PrimaryKeyColumn(AutoIncrement = false, Clustered = true, Name = "PK_IdName", OnColumns = "id,name")]
            public int Id { get; set; }
            [Column("name")]
            public string Name { get; set; } = string.Empty;
            [Column("description")]
            public string? Description { get; set; }
            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            [Column("logo")]
            public string Logo { get; set; } = string.Empty;
            [Column("data")]
            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            public string Data { get; set; } = string.Empty;
        }

image

Microsoft.Data.SqlClient.SqlException: 'Cannot insert the value NULL into column 'id', table 'dbo.memberGroupDetails'; column does not allow nulls. INSERT fails.

Not sure how to resolve this

ccasalicchio commented 2 months ago

did it like this, and it worked

        [TableName(TABLE_NAME)]
        [ExplicitColumns]
        public class GroupDetails
        {
            public const string TABLE_NAME = $"member{nameof(GroupDetails)}";

            [Column("groupId")]
            [Index(IndexTypes.UniqueNonClustered, ForColumns = "groupId,name",
                Name = "IX_" + TABLE_NAME + "_IdName")]
            public int GroupId { get; set; }

            [Column("name")]
            public string Name { get; set; } = string.Empty;

            [Column("description")]
            public string? Description { get; set; }

            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            [Column("logo")]
            public string Logo { get; set; } = string.Empty;

            [Column("data")]
            [SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
            public string Data { get; set; } = string.Empty;
        }