示例#1
0
        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);
        }