private static AssociationEndMember InitializeAssociationEndMember( AssociationType associationType, IRelationshipEnd end, EntityType endMemberType) { EdmMember edmMember; AssociationEndMember associationEndMember; if (!associationType.Members.TryGetValue(end.Name, false, out edmMember)) { associationEndMember = new AssociationEndMember(end.Name, endMemberType.GetReferenceType(), end.Multiplicity.Value); associationType.AddKeyMember((EdmMember)associationEndMember); } else { associationEndMember = (AssociationEndMember)edmMember; } RelationshipEnd relationshipEnd = end as RelationshipEnd; if (relationshipEnd != null && relationshipEnd.Documentation != null) { associationEndMember.Documentation = Converter.ConvertToDocumentation(relationshipEnd.Documentation); } return(associationEndMember); }
public static AssociationType AddAssociationType( this EdmModel model, string name, System.Data.Entity.Core.Metadata.Edm.EntityType sourceEntityType, RelationshipMultiplicity sourceAssociationEndKind, System.Data.Entity.Core.Metadata.Edm.EntityType targetEntityType, RelationshipMultiplicity targetAssociationEndKind, string modelNamespace = null) { AssociationType associationType = new AssociationType(name, modelNamespace ?? "CodeFirstNamespace", false, DataSpace.CSpace) { SourceEnd = new AssociationEndMember(name + "_Source", sourceEntityType.GetReferenceType(), sourceAssociationEndKind), TargetEnd = new AssociationEndMember(name + "_Target", targetEntityType.GetReferenceType(), targetAssociationEndKind) }; model.AddAssociationType(associationType); return(associationType); }
private DataModelErrorEventArgs ValidateAssociationTypeWithNonFkeyReference(DataSpace dataSpace) { var model = new EdmModel(dataSpace, 1.0); var intType = dataSpace == DataSpace.CSpace ? PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32) : FakeSqlProviderServices.Instance.GetProviderManifest("2008").GetStoreTypes().Single(t => t.Name == "int"); var principal = new EntityType("P", "ns", dataSpace, new [] { "Id" }, new[] { EdmProperty.CreatePrimitive("Id", intType) }); var dependent = new EntityType("P", "ns", dataSpace, new [] { "Id" }, new[] { EdmProperty.CreatePrimitive("Id", intType), EdmProperty.CreatePrimitive("NonKeyProperty", intType) }); foreach (var property in principal.Properties.Concat(dependent.Properties)) { property.Nullable = false; } var associationType = new AssociationType("AT", "ns", false, dataSpace) { Constraint = new ReferentialConstraint( new AssociationEndMember("P", principal.GetReferenceType(), RelationshipMultiplicity.One), new AssociationEndMember("C", dependent.GetReferenceType(), RelationshipMultiplicity.Many), principal.KeyProperties, dependent.Properties.Where(p => p.Name == "NonKeyProperty")) }; model.AddAssociationType(associationType); var validationContext = new EdmModelValidationContext(model, true); DataModelErrorEventArgs errorEventArgs = null; validationContext.OnError += (_, e) => errorEventArgs = e; EdmModelSemanticValidationRules .EdmAssociationType_ValidateReferentialConstraint .Evaluate(validationContext, model.AssociationTypes.Single()); return(errorEventArgs); }
/// <summary> /// Initialize the end member if its not initialized already /// </summary> /// <param name="associationType"></param> /// <param name="end"></param> /// <param name="endMemberType"></param> private static AssociationEndMember InitializeAssociationEndMember( AssociationType associationType, Som.IRelationshipEnd end, EntityType endMemberType) { AssociationEndMember associationEnd; EdmMember member; // make sure that the end is not initialized as of yet if (!associationType.Members.TryGetValue(end.Name, false /*ignoreCase*/, out member)) { // Create the end member and add the operations associationEnd = new AssociationEndMember( end.Name, endMemberType.GetReferenceType(), end.Multiplicity.Value); associationType.AddKeyMember(associationEnd); } else { associationEnd = (AssociationEndMember)member; } //Extract the optional Documentation var relationshipEnd = end as Som.RelationshipEnd; if (relationshipEnd != null && (relationshipEnd.Documentation != null)) { associationEnd.Documentation = ConvertToDocumentation(relationshipEnd.Documentation); } return associationEnd; }
public static AssociationType AddAssociationType( this EdmModel model, string name, EntityType sourceEntityType, RelationshipMultiplicity sourceAssociationEndKind, EntityType targetEntityType, RelationshipMultiplicity targetAssociationEndKind, string modelNamespace = null) { DebugCheck.NotNull(model); DebugCheck.NotEmpty(name); DebugCheck.NotNull(sourceEntityType); DebugCheck.NotNull(targetEntityType); var associationType = new AssociationType( name, modelNamespace ?? DefaultModelNamespace, false, DataSpace.CSpace) { SourceEnd = new AssociationEndMember( name + "_Source", sourceEntityType.GetReferenceType(), sourceAssociationEndKind), TargetEnd = new AssociationEndMember( name + "_Target", targetEntityType.GetReferenceType(), targetAssociationEndKind) }; model.AddAssociationType(associationType); return associationType; }
private DataModelErrorEventArgs ValidateAssociationTypeWithNonFkeyReference(DataSpace dataSpace) { var model = new EdmModel(dataSpace, 1.0); var intType = dataSpace == DataSpace.CSpace ? PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32) : FakeSqlProviderServices.Instance.GetProviderManifest("2008").GetStoreTypes().Single(t => t.Name == "int"); var principal = new EntityType("P", "ns", dataSpace, new [] {"Id"}, new[] { EdmProperty.CreatePrimitive("Id", intType) }); var dependent = new EntityType("P", "ns", dataSpace, new [] {"Id"}, new[] { EdmProperty.CreatePrimitive("Id", intType), EdmProperty.CreatePrimitive("NonKeyProperty", intType) }); foreach (var property in principal.Properties.Concat(dependent.Properties)) { property.Nullable = false; } var associationType = new AssociationType("AT", "ns", false, dataSpace) { Constraint = new ReferentialConstraint( new AssociationEndMember("P", principal.GetReferenceType(), RelationshipMultiplicity.One), new AssociationEndMember("C", dependent.GetReferenceType(), RelationshipMultiplicity.Many), principal.KeyProperties, dependent.Properties.Where(p => p.Name == "NonKeyProperty")) }; model.AddAssociationType(associationType); var validationContext = new EdmModelValidationContext(model, true); DataModelErrorEventArgs errorEventArgs = null; validationContext.OnError += (_, e) => errorEventArgs = e; EdmModelSemanticValidationRules .EdmAssociationType_ValidateReferentialConstraint .Evaluate(validationContext, model.AssociationTypes.Single()); return errorEventArgs; }
private EdmModel CreateModelWithAssociations(params EdmProperty[] foreignKeys) { var model = new EdmModel(DataSpace.SSpace); for (var i = 0; i < foreignKeys.Length; i++) { var sourceEntityType = new EntityType("E" + i, "N", DataSpace.SSpace); var targetEntityType = new EntityType("E" + i, "N", DataSpace.SSpace); model.AddEntitySet("S" + i, sourceEntityType); model.AddEntitySet("T" + i, targetEntityType); var fk = foreignKeys[i]; var associationType = new AssociationType((fk == null ? "IA" : fk.Name) + i, "MN", false, DataSpace.SSpace) { SourceEnd = new AssociationEndMember( "A_Source" + i, sourceEntityType.GetReferenceType(), RelationshipMultiplicity.ZeroOrOne), TargetEnd = new AssociationEndMember( "A_Target" + i, targetEntityType.GetReferenceType(), RelationshipMultiplicity.Many) }; model.AddAssociationType(associationType); if (fk != null) { var constraint = new ReferentialConstraint( associationType.SourceEnd, associationType.TargetEnd, new[] { new EdmProperty("SourceProperty") }, new[] { fk }); associationType.Constraint = constraint; } model.AddAssociationSet("Set" + (fk == null ? "IA" : fk.Name) + i, associationType); } return model; }