public void HasKeyOnDerivedTypes_Throws_IfCallDerivedFromFirst_ThenHasKey() { // Arrange ODataModelBuilder builder = new ODataModelBuilder(); builder.EntityType <Vehicle>().Abstract(); builder.EntityType <Motorcycle>().DerivesFrom <Vehicle>().HasKey(m => m.ID); EntityTypeConfiguration <SportBike> sportBikeType = builder.EntityType <SportBike>(); // Act & Assert ExceptionAssert.Throws <InvalidOperationException>(() => sportBikeType.DerivesFrom <Motorcycle>().HasKey(s => s.SportBikeProperty_NotVisible), "Cannot define keys on type 'Microsoft.AspNet.OData.Test.Builder.TestModels.SportBike' deriving from 'Microsoft.AspNet.OData.Test.Builder.TestModels.Motorcycle'. " + "The base type in the entity inheritance hierarchy already contains keys."); }
static EntitySetConfiguration CreateEntitySet(XPClassInfo classInfo, ODataModelBuilder builder) { EntitySetConfiguration entitySetConfig = builder.EntitySets.FirstOrDefault(t => t.EntityType.ClrType == classInfo.ClassType); if (entitySetConfig != null) { return(entitySetConfig); } EntityTypeConfiguration entityTypeConfig = builder.AddEntityType(classInfo.ClassType); entitySetConfig = builder.AddEntitySet(classInfo.ClassType.Name, entityTypeConfig); if (classInfo.PersistentBaseClass != null) { EntitySetConfiguration baseClassEntitySetConfig = CreateEntitySet(classInfo.PersistentBaseClass, builder); entityTypeConfig.DerivesFrom(baseClassEntitySetConfig.EntityType); } else { if (classInfo.KeyProperty is ReflectionFieldInfo) { foreach (XPMemberInfo mi in classInfo.Members) { if (mi.IsAliased) { string aliasedExpr = ((PersistentAliasAttribute)mi.GetAttributeInfo(typeof(PersistentAliasAttribute))).AliasExpression; var aliasedCriteria = CriteriaOperator.Parse(aliasedExpr) as OperandProperty; if (!ReferenceEquals(null, aliasedCriteria) && aliasedCriteria.PropertyName == classInfo.KeyProperty.Name) { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(mi.Name)); break; } } } } else { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(classInfo.KeyProperty.Name)); } } return(entitySetConfig); }
static EntitySetConfiguration CreateEntitySet(XPClassInfo classInfo, ODataModelBuilder builder) { EntitySetConfiguration entitySetConfig = builder.EntitySets.FirstOrDefault(t => t.EntityType.ClrType == classInfo.ClassType); if (entitySetConfig != null) { return(entitySetConfig); } EntityTypeConfiguration entityTypeConfig = builder.AddEntityType(classInfo.ClassType); entitySetConfig = builder.AddEntitySet(classInfo.ClassType.Name, entityTypeConfig); if (classInfo.PersistentBaseClass != null) { EntitySetConfiguration baseClassEntitySetConfig = CreateEntitySet(classInfo.PersistentBaseClass, builder); entityTypeConfig.DerivesFrom(baseClassEntitySetConfig.EntityType); } else { entityTypeConfig.HasKey(classInfo.ClassType.GetProperty(classInfo.KeyProperty.Name)); } return(entitySetConfig); }