Как создать отношение один к одному в классах DevExpress XPO?

Вскоре,

Вот схема

Таблица пользователей

Пользовательская таблица

Таблица категорий

Таблица категорий

  1. У пользователя есть идентификатор категории
  2. Все, что мне нужно, чтобы заполнить GridControl User_ID, CategoryID, CategoryName
  3. Обратите внимание, что CategoryName принадлежит только второй таблице (Category Table).

Я делаю следующее:

Создание моделей (пользователь, категория) Обратите внимание, что первичный ключ является составным, поэтому он должен иметь структуру https://supportcenter.devexpress.com/ticket/details/a2615/xpo-how-to-map-persistent-objects.-to-database-tables-with-compound-or-composite-multi#

// Composite key must be a struct
public struct user_key
{
    [Persistent("user_brn")]
    public int user_brn { get; set; }
    [Persistent("user_num")]
    public int user_num { get; set; }
}

[Persistent("Users")]
public class User : XPLiteObject
{
    public User(Session session) : base(session) { }

    [Key, Persistent] 
    public user_key key;    // user_brn, user_num

    [Persistent("user_name")]
    public string user_name { get; set; }

    [Persistent("CategoryID")]
    public int CategoryID { get; set; }

    [NonPersistent, Association("user_category")]
    public Category Category
    {
        get; set;
    }

    [PersistentAlias("Category.CategoryName")]
    public string CategoryName { get; set; }            // I think it will work. But it doesn't
}


[Persistent("Category")]
public class Category : XPLiteObject
{
    public Category(Session session) : base(session) { }

    [Key, Persistent("CategoryID")]
    public int CategoryID { get; set; }

    [Persistent("CategoryName")]
    public string CategoryName { get; set; }

    private User _user;
    [NonPersistent, Association("user_category")]
    public User User { get; set; }
}

Код GridView

 IDataLayer dal = 
 XpoDefault.GetDataLayer(MSSqlConnectionProvider.GetConnectionString(" 
 (local)", "testdb"), AutoCreateOption.DatabaseAndSchema);
 Session session = new Session(dal);
 XPCollection collection = new XPCollection(session, typeof(User));
 gridControl1.DataSource = collection;

Результат: = сбой

Результат

Что я должен делать? Любая помощь


person deveton    schedule 18.02.2021    source источник


Ответы (2)


В своем классе User удалите свойство CategoryId и измените свойство Category следующим образом:

[Persistent("CategoryID")]
public Category Category
{
    get; set;
}

и измените свойство CategoryName:

[PersistentAlias("Category.CategoryName")]
public string CategoryName 
{ 
    get
    {
        return (string)EvaluateAlias(nameof(CategoryName));
    }
}  

Ссылка от Category обратно к User сложнее, так как для нее нет постоянного поля. Вы можете попробовать это с бесплатным присоединением:

[PersistentAlias("[<User>][Category = '@This.CategoryID'].Single()")]
public User User 
{ 
    get
    {
        return (User)EvaluateAlias(nameof(User));
    }
}  
person Marco    schedule 23.03.2021
comment
PS: Если вам не нужен XPO для сопоставления с существующей структурой БД, я бы рекомендовал использовать XPObject в качестве базового класса. Он предлагает большую гибкость, но требует изменений схемы, таких как столбец ObjectType. - person Marco; 23.03.2021
comment
@deveton, не могли бы вы проверить, работает ли мой ответ для вас, и проголосовать, если он вас устраивает? Спасибо - person Marco; 25.03.2021

В отношениях один к одному таблицы должны иметь одинаковые ключи.

person Jason Dimmick    schedule 18.02.2021
comment
как насчет stackoverflow.com/questions/66647272/ - person ; 21.03.2021