EF Core получает навигационные свойства объекта из модели с кратностью ноль или единица.

Вы должны быть осторожны с форматами m / d / Y и m-d-Y. PHP считает, что / означает, что m / d / Y и - означают d-m-Y. Я бы явно описал формат ввода в этом случае:

$ymd = DateTime::createFromFormat('m-d-Y', '10-16-2003')->format('Y-m-d');

Таким образом, вы не находитесь в капризе определенной интерпретации.

0
задан Norcino 3 March 2019 в 11:09
поделиться

1 ответ

После проверки исходного кода в GitHub я могу с достаточной уверенностью сказать, что в EF Core нет такого понятия, как множественность.

Я создал перечисление, подобное используемому .net Framework 3.5+ (см .: Официальная документация ):

public enum RelationshipMultiplicity
{
    Many = 2,
    One = 1,
    ZeroOrOne = 0
}

А затем метод расширения, который позволяет получать все свойства навигации с использованием перечисление как фильтр. Ключевые вещи, которые я использовал:

Метод позволяет получить все свойства Navigations по типу отношения

public static class ModelExtensions
{
    /// <summary>
    /// Extension method used to get from the entity all navigation properties by multiplicity
    /// </summary>
    /// <typeparam name="T">Entity from where the navigation properties are taken</typeparam>
    /// <param name="model">Context Model</param>
    /// <param name="multiplicity">Type of multiplicity to use</param>
    /// <returns>List of PropertyInfo of Navigation Properties</returns>
    public static IEnumerable<PropertyInfo> GetNavigationProperties<T>(this IModel model, RelationshipMultiplicity multiplicity)
    {
        var navigations = model.GetEntityTypes().FirstOrDefault(m => m.ClrType == typeof(T))?.GetNavigations();
        var properties = new List<PropertyInfo>();

        switch (multiplicity)
        {
            case RelationshipMultiplicity.Many | RelationshipMultiplicity.ZeroOrOne:
                return navigations?
                    .Select(nav => nav.PropertyInfo);
            case RelationshipMultiplicity.Many:
                return navigations?
                    .Where(nav => nav.IsCollection())
                    .Select(nav => nav.PropertyInfo);
            case RelationshipMultiplicity.One:
                return navigations?
                    .Where(nav => !nav.IsCollection() && nav.ForeignKey.IsRequired)
                    .Select(nav => nav.PropertyInfo);
            case RelationshipMultiplicity.ZeroOrOne:
                return navigations?
                    .Where(nav => !nav.IsCollection())
                    .Select(nav => nav.PropertyInfo);
            default:
                return null;
        }

        return properties;
    }
}

Пример использования:

var oneToManyRelations = _context.Model.GetNavigationProperties<Transaction>(
    RelationshipMultiplicity.ZeroOrOne);

var manyToOneRelations = _context.Model.GetNavigationProperties<Transaction>(
    RelationshipMultiplicity.Many);

var allRelations = _context.Model.GetNavigationProperties<Transaction>(
    RelationshipMultiplicity.Many | 
    RelationshipMultiplicity.ZeroOrOne);
0
ответ дан Norcino 3 March 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: