Ассоциации "через точку"
От: Naf2000  
Дата: 22.05.23 07:12
Оценка:
Имеем систему классов:
    class Ref<TEntity>
        where TEntity : Entity
    {
        public long ID { get; init; }
        public TEntity Data => default!;
    }

    abstract class Entity 
    {        
        [PrimaryKey, Identity]
        public long ID { get; init; }
    }        
    
    abstract class Catalog : Entity
    {
        [Column]
        public string Name { get; init; } = default!;
    }

    [Table("Persons")]
    class Person: Catalog
    {
    }        

    [Table("Storages")]
    class Storage : Catalog
    {
        public Ref<Person> Manager { get; init; } = default!;
        //public Person ManagerData { get; init; } = default!;
    }


Ref<TEntity> — оболочка для агрегации и внешнего ключа.
Однако выдает ошибку, что не может разобрать написанное:

's.Manager.Data.Name' cannot be converted to SQL.


Вот код:

            var builder = new FluentMappingBuilder(context.MappingSchema);
            builder.Entity<Storage>().Property(s => s.Manager.ID).HasColumnName(nameof(Storage.Manager));
            builder.Entity<Storage>().Association(s => s.Manager.Data, (s, p) => s.Manager.ID == p.ID);
            builder.Build();
            var query = context.GetTable<Storage>().Select(s => s.Manager.Data).Select(p => new { p.Name });


Стоит раскомментировать //public Person ManagerData { get; init; } = default!;
и всюду заменить Manager.Data на ManagerData как всё работает.

Можно в принципе использовать ассоциации, написанные "через вторую точку": s => s.Manager.Data вопрос?
associationattribute
Re: Ассоциации "через точку"
От: Mace Windu  
Дата: 23.05.23 21:16
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>Можно в принципе использовать ассоциации, написанные "через вторую точку": s => s.Manager.Data вопрос?


Такой сценарий у нас точно не тестируется сейчас, поэтому, учитывая ошибку, думаю не поддерживается такое. Я добавлю issue, думаю имеет смысл пофиксить, учитывая что для колонок мы такое поддерживаем.

https://github.com/linq2db/linq2db/issues/4139
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.