Неявные внешние ключи
От: Naf2000  
Дата: 28.09.21 14:14
Оценка:
Имеется простейшая схема базы

Можно ли настроить linq2db так, чтобы не писать явно внешний ключ в классе Order:
[Table("Partners")]
    class Partner
    {
        [PrimaryKey, Identity]
        public long ID { get; set; }
        [Column]
        public string Name { get; set; }
    }

    [Table("Orders")]
    class Order
    {
        [PrimaryKey, Identity]
        public long ID { get; set; }
        [Column]
        public string Number { get; set; }
        [Association(ThisKey = "Partner", OtherKey = "ID")]
        public Partner Partner { get; set; }
    }

И при этом было доступно примерно такое:
var query = db.GetTable<Order>().Select(_=>_.Partner.Name);
var list = query.ToList();
Re: Неявные внешние ключи
От: IT Россия linq2db.com
Дата: 28.09.21 14:46
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>Имеется простейшая схема базы

N>Image: OpderPartner.PNG
N>Можно ли настроить linq2db так, чтобы не писать явно внешний ключ в классе Order:

Можно через extensions, только получится не свойство, а метод.

public static class AssociationExtensions
{
    [Association(ThisKey = "Partner", OtherKey = "ID")]
    public static Partner Partner(this Order order)
    {
        throw new InvalidOperationException("Used only as Association helper");
    }
}
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Неявные внешние ключи
От: Naf2000  
Дата: 28.09.21 17:55
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Naf2000, Вы писали:


N>>Имеется простейшая схема базы

N>>Image: OpderPartner.PNG
N>>Можно ли настроить linq2db так, чтобы не писать явно внешний ключ в классе Order:

IT>Можно через extensions, только получится не свойство, а метод.


IT>
IT>public static class AssociationExtensions
IT>{
IT>    [Association(ThisKey = "Partner", OtherKey = "ID")]
IT>    public static Partner Partner(this Order order)
IT>    {
IT>        throw new InvalidOperationException("Used only as Association helper");
IT>    }
IT>}
IT>


А с чем такое ограничение связано?
Re[3]: Неявные внешние ключи
От: IT Россия linq2db.com
Дата: 28.09.21 17:56
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>А с чем такое ограничение связано?


С возможностями .NET.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Неявные внешние ключи
От: Naf2000  
Дата: 28.09.21 18:13
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Naf2000, Вы писали:


N>>Имеется простейшая схема базы

N>>Image: OpderPartner.PNG
N>>Можно ли настроить linq2db так, чтобы не писать явно внешний ключ в классе Order:

IT>Можно через extensions, только получится не свойство, а метод.


IT>
IT>public static class AssociationExtensions
IT>{
IT>    [Association(ThisKey = "Partner", OtherKey = "ID")]
IT>    public static Partner Partner(this Order order)
IT>    {
IT>        throw new InvalidOperationException("Used only as Association helper");
IT>    }
IT>}
IT>

Что-то не вышло: LinqToDB.Linq.LinqException: "Association key 'Partner' not found for type 'ConsoleApp21.Order."
Re[3]: Неявные внешние ключи
От: IT Россия linq2db.com
Дата: 28.09.21 23:07
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>Что-то не вышло: LinqToDB.Linq.LinqException: "Association key 'Partner' not found for type 'ConsoleApp21.Order."


А раньше выходило?
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Неявные внешние ключи
От: Naf2000  
Дата: 29.09.21 05:43
Оценка:
Здравствуйте, IT, Вы писали:

IT>Здравствуйте, Naf2000, Вы писали:


N>>Что-то не вышло: LinqToDB.Linq.LinqException: "Association key 'Partner' not found for type 'ConsoleApp21.Order."


IT>А раньше выходило?


В случае свойства выходило так:

Необработанное исключение типа "System.InvalidOperationException" в linq2db.dll
The binary operator Equal is not defined for the types 'ConsoleApp21.Partner' and 'System.Int64'.
Re[5]: Неявные внешние ключи
От: Mace Windu  
Дата: 29.09.21 08:41
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>Здравствуйте, IT, Вы писали:


IT>>Здравствуйте, Naf2000, Вы писали:


N>>>Что-то не вышло: LinqToDB.Linq.LinqException: "Association key 'Partner' not found for type 'ConsoleApp21.Order."


IT>>А раньше выходило?


N>В случае свойства выходило так:


N>Необработанное исключение типа "System.InvalidOperationException" в linq2db.dll

N>The binary operator Equal is not defined for the types 'ConsoleApp21.Partner' and 'System.Int64'.


Partner — ассоциация, а надо ссылка на поле ключа.

[Association(ThisKey = "ID", OtherKey = "ID")]


или что мне больше нравится:

[Association(ThisKey = nameof(Order.ID), OtherKey = nameof(Partner.ID))]
Re[6]: Неявные внешние ключи
От: Naf2000  
Дата: 29.09.21 10:04
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, Naf2000, Вы писали:


N>>Здравствуйте, IT, Вы писали:


IT>>>Здравствуйте, Naf2000, Вы писали:


N>>>>Что-то не вышло: LinqToDB.Linq.LinqException: "Association key 'Partner' not found for type 'ConsoleApp21.Order."


IT>>>А раньше выходило?


N>>В случае свойства выходило так:


N>>Необработанное исключение типа "System.InvalidOperationException" в linq2db.dll

N>>The binary operator Equal is not defined for the types 'ConsoleApp21.Partner' and 'System.Int64'.


MW>Partner — ассоциация, а надо ссылка на поле ключа.


MW>
MW>[Association(ThisKey = "ID", OtherKey = "ID")]
MW>


MW>или что мне больше нравится:


MW>
MW>[Association(ThisKey = nameof(Order.ID), OtherKey = nameof(Partner.ID))]
MW>

сомневаюсь, в таблице Orders поле ключа называется "Partner" все-таки
Re[7]: Неявные внешние ключи
От: Mace Windu  
Дата: 29.09.21 10:10
Оценка:
Здравствуйте, Naf2000, Вы писали:


N>сомневаюсь, в таблице Orders поле ключа называется "Partner" все-таки


Тогда его забыли объявить

[Table("Orders")]
    class Order
    {
        [PrimaryKey, Identity]
        public long ID { get; set; }
        [Column]
        public string Number { get; set; }
        [Association(ThisKey = "PartnerId", OtherKey = "ID")]
        public Partner Partner { get; set; }

        // например так
        [Column("Partner")]
        public long? PartnerId { get; set; }
    }
Отредактировано 29.09.2021 10:10 Mace Windu . Предыдущая версия .
Re[8]: Неявные внешние ключи
От: Naf2000  
Дата: 29.09.21 13:55
Оценка:
Здравствуйте, Mace Windu, Вы писали:

MW>Здравствуйте, Naf2000, Вы писали:



N>>сомневаюсь, в таблице Orders поле ключа называется "Partner" все-таки


MW>Тогда его забыли объявить

MW>

MW>[Table("Orders")]
MW>    class Order
MW>    {
MW>        [PrimaryKey, Identity]
MW>        public long ID { get; set; }
MW>        [Column]
MW>        public string Number { get; set; }
MW>        [Association(ThisKey = "PartnerId", OtherKey = "ID")]
MW>        public Partner Partner { get; set; }

MW>        // например так
MW>        [Column("Partner")]
MW>        public long? PartnerId { get; set; }
MW>    }

MW>

Казалось бы примерно с этого и начиналась ветка обсуждения. Как не объявлять
Re[5]: Неявные внешние ключи
От: IT Россия linq2db.com
Дата: 29.09.21 22:02
Оценка:
Здравствуйте, Naf2000, Вы писали:

IT>>А раньше выходило?

N>В случае свойства выходило так:
N>Необработанное исключение типа "System.InvalidOperationException" в linq2db.dll
N>The binary operator Equal is not defined for the types 'ConsoleApp21.Partner' and 'System.Int64'.

Оно не может работать в принципе, потому как ThisKey задан неверно. Я поначалу просто не обратил внимания и тупо скопировал код.
Если нам не помогут, то мы тоже никого не пощадим.
Re[9]: Неявные внешние ключи
От: Ночной Смотрящий Россия  
Дата: 30.09.21 06:35
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>Казалось бы примерно с этого и начиналась ветка обсуждения. Как не объявлять


А зачем?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[10]: Неявные внешние ключи
От: Naf2000  
Дата: 30.09.21 19:38
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Naf2000, Вы писали:


N>>Казалось бы примерно с этого и начиналась ветка обсуждения. Как не объявлять


НС>А зачем?


Причин несколько и они в какой-то мере взаимосвязаны:

1. Зачем иметь PartnerID как отдельное свойство, если сам Partner содержит эти данные в ID?
2. PartnerID низкоуровневый термин (попросту число) чем Partner. Зачем им оперировать, если можно обращаться с объектами из модели? К тому же это небезопасно. Запросто можно написать PartnerID==OrderID что семантически неверно. Написать Partner==Order не выйдет.
3. Может произойти коллизия не консистентности, когда PartnerID!=Partner.ID

Возможно я не понимаю философию linq
Re[11]: Неявные внешние ключи
От: Ночной Смотрящий Россия  
Дата: 01.10.21 07:29
Оценка:
Здравствуйте, Naf2000, Вы писали:

N>1. Зачем иметь PartnerID как отдельное свойство, если сам Partner содержит эти данные в ID?


С точки зрения реляционной модели это разные вещи. Ну и философия linq2db — не маскировать природу данных. Поэтому идея прятать реально существующее поле — так себе.

N>2. PartnerID низкоуровневый термин (попросту число) чем Partner.


Да. В этом суть l2db — lightweight ORM. Если подход не устраивает — лучше выбрать другой инструмент, более тяжеловесный.

N>3. Может произойти коллизия не консистентности, когда PartnerID!=Partner.ID


Не может, если сделать свойство Partner readonly и выбрасывать исключение при попытке к нему обратиться.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[12]: Неявные внешние ключи
От: Naf2000  
Дата: 01.10.21 14:28
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, Naf2000, Вы писали:


N>>1. Зачем иметь PartnerID как отдельное свойство, если сам Partner содержит эти данные в ID?


НС>С точки зрения реляционной модели это разные вещи. Ну и философия linq2db — не маскировать природу данных. Поэтому идея прятать реально существующее поле — так себе.


N>>2. PartnerID низкоуровневый термин (попросту число) чем Partner.


НС>Да. В этом суть l2db — lightweight ORM. Если подход не устраивает — лучше выбрать другой инструмент, более тяжеловесный.


N>>3. Может произойти коллизия не консистентности, когда PartnerID!=Partner.ID


НС>Не может, если сделать свойство Partner readonly и выбрасывать исключение при попытке к нему обратиться.


И все таки удалось:

    [Table("Partners")]
    public class Partner
    {
        [PrimaryKey, Identity]
        public long ID { get; set; }
        [Column]
        public string Name { get; set; }
    }

    [Table("Orders")]
    [Column(Name="Partner",MemberName="Partner.ID")]
    public class Order
    {
        [PrimaryKey, Identity]
        public long ID { get; set; }
        [Column]
        public string Number { get; set; }
        private static Expression<Func<Order, IDataContext, IQueryable<Partner>>> PartnerImpl => (_, db) => db.GetTable<Partner>().Where(s => s.ID == _.Partner.ID);
        [Association(QueryExpressionMethod = nameof(Order.PartnerImpl))]
        public Partner Partner { get; set; }
    }
Re[13]: Неявные внешние ключи
От: Ночной Смотрящий Россия  
Дата: 01.10.21 16:33
Оценка: :)
Здравствуйте, Naf2000, Вы писали:

N>И все таки удалось:


Это как в анекдоте про баню, голых и комиссию.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[13]: Неявные внешние ключи
От: Danchik Украина  
Дата: 01.10.21 16:43
Оценка:
Здравствуйте, Naf2000, Вы писали:

[Skip]

Ну да, linq2db может и гибок и дает возможность стрелять в ногу, но зачем?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.