public void Apply_should_introduce_constraint_when_one_to_one() { var entityType1 = new EntityType("E", "N", DataSpace.CSpace); entityType1.AddKeyMember(EdmProperty.Primitive("P", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String))); var entityType2 = new EntityType("E", "N", DataSpace.CSpace); entityType2.AddKeyMember(EdmProperty.Primitive("P", PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String))); var associationType = new AssociationType("A", XmlConstants.ModelNamespace_3, false, DataSpace.CSpace); associationType.SourceEnd = new AssociationEndMember("S", entityType2); associationType.TargetEnd = new AssociationEndMember("T", entityType1); associationType.MarkPrincipalConfigured(); ((IEdmConvention<AssociationType>)new OneToOneConstraintIntroductionConvention()) .Apply(associationType, new EdmModel(DataSpace.CSpace)); Assert.NotNull(associationType.Constraint); Assert.Equal(1, associationType.Constraint.ToProperties.Count); }
private void ConfigureDependentBehavior( AssociationType associationType, EdmModel model, EntityTypeConfiguration entityTypeConfiguration) { DebugCheck.NotNull(associationType); DebugCheck.NotNull(model); DebugCheck.NotNull(entityTypeConfiguration); AssociationEndMember principalEnd; AssociationEndMember dependentEnd; if (!associationType.TryGuessPrincipalAndDependentEnds(out principalEnd, out dependentEnd)) { if (IsNavigationPropertyDeclaringTypePrincipal.HasValue) { associationType.MarkPrincipalConfigured(); var navProp = model.Namespaces .SelectMany(ns => ns.EntityTypes) .SelectMany(et => et.DeclaredNavigationProperties) .Single(np => np.GetClrPropertyInfo().IsSameAs(NavigationProperty)); principalEnd = IsNavigationPropertyDeclaringTypePrincipal.Value ? associationType.GetOtherEnd(navProp.ResultEnd) : navProp.ResultEnd; dependentEnd = associationType.GetOtherEnd(principalEnd); if (associationType.SourceEnd != principalEnd) { // need to move around source to be principal, target to be dependent so Edm services will use the correct // principal and dependent ends. The Edm default Db + mapping service tries to guess principal/dependent // based on multiplicities, but if it can't figure it out, it will use source as principal and target as dependent associationType.SourceEnd = principalEnd; associationType.TargetEnd = dependentEnd; var associationSet = model.Containers .SelectMany(ct => ct.AssociationSets) .Single(aset => aset.ElementType == associationType); var sourceSet = associationSet.SourceSet; associationSet.SourceSet = associationSet.TargetSet; associationSet.TargetSet = sourceSet; } } if (principalEnd == null) { dependentEnd = associationType.TargetEnd; } } ConfigureConstraint(associationType, dependentEnd, entityTypeConfiguration); ConfigureDeleteAction(associationType.GetOtherEnd(dependentEnd)); }