Table Inheritance
От: iGrog Финляндия  
Дата: 01.12.10 12:38
Оценка:
А может ли мне помочь BLToolkit в таком сценарии:

Есть табличка goods, в которой общие поля для всех товаров
Есть таблички books, video, в которых есть поля специфичные для книг и видео.
Покажу на примере:

    [TableName("goods")]
    [InheritanceMapping(Code = (int)EntityEnum.Books, Type = typeof(Book))]
    [InheritanceMapping(Code = (int)EntityEnum.Video, Type = typeof(Video))]
    public abstract class Good : EditableObject<Good>
    {
        [Identity, PrimaryKey]
        public abstract int GID { get; set; }

        [MapField(MapName="entity_id", IsInheritanceDiscriminator=true)]
        public abstract EntityEnum EntityID { get; set; }

        [MapField("title_ru")]
        public abstract String TitleRu { get; set; }
    }

    [TableName("books")]
    public abstract class Book : Good
    {
        /// <summary>
        /// Количество страниц у книги
        /// </summary>
        [MapField("pages")]
        public abstract int? Pages { get; set; }
    }

    [TableName("video")]
    public abstract class Video : Good
    {
        /// <summary>
        /// Год выхода фильма
        /// </summary>
        [MapField("video_year")]
        public abstract int YearOfVideo { get; set; }
    }


Соответственно, я бы хотел используя BLToolkit выбирать из базы эти объекты.
C LINQ я даже не понял, вообще, как составлять такой запрос, но и простой SQL, заданный ручками, так же не заработал:

                var sql = "SELECT * FROM goods AS g "
                          + "LEFT JOIN books AS b ON (b.gid=g.gid AND g.entity_id = 1) "
                          + "LEFT JOIN video AS v ON (v.gid=g.gid AND g.entity_id = 2) "
                          + "WHERE g.GID=1"; // я не знаю, что именно за объект с GID==1
                db.SetCommand(sql);
                
                var good = db.ExecuteObject(typeof (Good));


в goods я бы хотел получить объекты типов в зависимости от InheritanceDiscriminator.
Ну и соответствующие запросы db.ExecuteList<Good>()...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.