Property - a list of objects with a composite primary key

1 posts, 0 answers
  1. Vitaliy
    Vitaliy avatar
    36 posts
    Member since:
    Dec 2008

    Posted 17 Mar Link to this post

    CREATE TABLE hml.Director (
      Id INT IDENTITY
    ...
    )
     
    CREATE TABLE DirectorProperty (
      DirectorID INT NOT NULL
     ,PropertyID INT NOT NULL
     ,DateAdded DATETIME NULL CONSTRAINT DF_DirectorProperty_DateAdded DEFAULT (GETDATE())
     ,MainDirector BIT NOT NULL CONSTRAINT DirectorProperty_MainDirector_DF DEFAULT (0)
     ,CONSTRAINT PK_DirectorProperty PRIMARY KEY CLUSTERED (DirectorID, PropertyID)
     ,CONSTRAINT FK_DirectorProperty_Director FOREIGN KEY (DirectorID) REFERENCES Director (Id) ON DELETE CASCADE
     ,CONSTRAINT FK_DirectorProperty_PROPERTY FOREIGN KEY (PropertyID) REFERENCES PROPERTY (PKEY)
    )

     

    public class PMSDirectorProperty
       {
           public static MappingConfiguration GetMapping()
           {
               var cfg = new MappingConfiguration<PMSDirectorProperty>();
               PMSMetadataSource.SetDefaultFiledNamingRules(cfg);
               cfg.MapType(m => new
               {
                   m.DirectorId,
                   m.PropertyId
               }).ToTable("DirectorProperty");
     
               cfg.HasIdentity(c => c.DirectorId);
               cfg.HasIdentity(c => c.PropertyId);
     
               cfg.HasAssociation(c => c.Property).ToColumn("PropertyID");
               cfg.HasAssociation(c => c.Director).ToColumn("DirectorID");
               return cfg;
           }
     
           public int DirectorId { get; private set; }
           public int PropertyId { get; private set; }
     
           public DateTime? DateAdded { get; set; }
           public bool MainDirector { get; set; }
           public PMSDirector Director { get; set; }
           public PMSProperty Property { get; set; }
       }

    public class PMSDirector : GUIObject
        {
     
            public static MappingConfiguration GetMapping()
            {
                var cfg = new MappingConfiguration<PMSDirector>();
                PMSMetadataSource.SetDefaultFiledNamingRules(cfg);
                cfg.MapType().UseDefaultMap().ToTable("Director");
                cfg.HasProperty(c => c.Id).IsIdentity(KeyGenerator.Autoinc);
                cfg.HasAssociation(c => c.PreferedContactMethodID).ToColumn("PreferedContactMethodID");
                cfg.HasAssociation(c => c.RMCContact).ToColumn("RMCContactID");
     
                cfg.HasAssociation(c => c.Tenants).MapJoinTable("DirectorTenant", (director, tenant) => new
                {
                    TKEY = tenant.Tkey,
                    DirectorID = director.Id
                });
     
                cfg.HasAssociation(c => c.DirectorProperties).MapJoinTable("DirectorProperty", (director, property) => new
                {
                    PropertyID = property.PropertyId,
                    DirectorID = director.Id
                });
     
                cfg.HasProperty(c => c.AddressIsSpecified).AsTransient();
                cfg.HasProperty(c => c.IsTenant).AsTransient();
                cfg.HasProperty(c => c.PCShareDirector).AsTransient();
                return cfg;
            }
    ...
    }

     

    Getting a run-time exception on trying to get a PMSDirector from the database:

    Telerik.OpenAccess.Exceptions.MetadataException : The field '<value>' of class 'DataDomain.Property.PMSDirector' must use nested db-column extensions in a db-ref extension as the class 'DataDomain.Property.PMSDirectorProperty' has a composite primary key. --> FromMetadataContainer/namespace[DataDomain.Property]/class[PMSDirector]/field[<DirectorProperties>k__BackingField]/collection/db-link-table/db-value/db-column

     

Back to Top