diff --git a/src/EFCore.Jet.Data/DaoSchema.cs b/src/EFCore.Jet.Data/DaoSchema.cs index 585ca2c..f707a34 100644 --- a/src/EFCore.Jet.Data/DaoSchema.cs +++ b/src/EFCore.Jet.Data/DaoSchema.cs @@ -682,6 +682,33 @@ namespace EntityFrameworkCore.Jet.Data return ordinalPositions; } + public Dictionary GetRelationTypes() + { + var result = new Dictionary(); + using var relations = _database.Relations; + var relationCount = (int)relations.Count; + + for (var i = 0; i < relationCount; i++) + { + using var relation = relations[i]; + + var relationName = (string)relation.Name; + var attributes = (RelationAttributeEnum)relation.Attributes; + + var relationType = (attributes & RelationAttributeEnum.dbRelationUnique) == RelationAttributeEnum.dbRelationUnique + ? "ONE" + : "MANY"; + + var isEnforced = (attributes & RelationAttributeEnum.dbRelationDontEnforce) != RelationAttributeEnum.dbRelationDontEnforce; + + var isInherited = (attributes & RelationAttributeEnum.dbRelationInherited) != RelationAttributeEnum.dbRelationInherited; + + result.Add(relationName, (relationType,isEnforced,isInherited)); + } + + return result; + } + public override void Dispose() { _database.Dispose(); diff --git a/src/EFCore.Jet.Data/PreciseSchema.cs b/src/EFCore.Jet.Data/PreciseSchema.cs index 3d47d43..aa4ca46 100644 --- a/src/EFCore.Jet.Data/PreciseSchema.cs +++ b/src/EFCore.Jet.Data/PreciseSchema.cs @@ -49,13 +49,33 @@ namespace EntityFrameworkCore.Jet.Data => _adoxSchema.Value.GetIndexes(); // either ADOX or DAO is fine public override DataTable GetIndexColumns() - => _daoSchema.Value.GetIndexColumns(); // either ADOX or DAO is fine + => _adoxSchema.Value.GetIndexColumns(); // either ADOX or DAO is fine + //ADOX can get more detail for the onupdate and ondelete rules (set null and set default) + //DAO can get the relation type (1 to 1 or 1 to many) + //DAO can get isenforced and isherited public override DataTable GetRelations() - => _daoSchema.Value.GetRelations(); // either ADOX or DAO is fine + { + var dataTable = _adoxSchema.Value.GetRelations(); + var reltypes = _daoSchema.Value.GetRelationTypes(); + + foreach (DataRow row in dataTable.Rows) + { + var relationName = (string)row["RELATION_NAME"]; + + if (reltypes.TryGetValue(relationName, out var relationType)) + { + row["RELATION_TYPE"] = relationType.relationType; + row["IS_ENFORCED"] = relationType.isEnforced; + row["IS_INHERITED"] = relationType.isInherited; + } + } + dataTable.AcceptChanges(); + return dataTable; + } public override DataTable GetRelationColumns() - => _daoSchema.Value.GetRelationColumns(); // either ADOX or DAO is fine + => _adoxSchema.Value.GetRelationColumns(); // either ADOX or DAO is fine public override DataTable GetCheckConstraints() => _adoxSchema.Value.GetCheckConstraints(); // DAO does not support CHECK CONSTRAINTs, but ADOX does