Как правильно получить значения всех свойств объекта, используя EF
Мне достаточно сложно объяснить в двух словах, в чем именно проблема, прошу дочитать до конца. У меня есть несколько классов.
Expense.cs
public partial class Expense
{
public int ExId { get; set; }
public int CheckId { get; set; }
public string Name { get; set; }
public Catg Catg { get; set; }
.....
public User User { get; set; }
.....
}
Catg.cs
public class Catg
{
public int CatgId { get; set; }
public string CatgName { get; set; }
public SqlHierarchyId HierarchyId { get; set; }
}
User.cs
public partial class User
{
public int UserId { get; set; }
public string Username { get; set; }
}
Допустим, я хочу получить список всех объектов класса Expense, чтобы вывести его в Datagrid.
public List<Expense> Expenses = GetExpences(new ApplicationDbContext());
public List<Expense> GetExpences(ApplicationDbContext db)
{
return (from ex in db.Expenses
select ex).ToList();
}
И вот тут возникает проблема. Значения тех полей, которые имеют стандартные типы int, string и так далее, возвращаются без проблем. Но в качестве Catg и User мне возвращаются соответствующие объекты, которые содержат только значения идентификатора, но не само их название. В ApplicationDbContext описание сущности выглядит вот так. Получается, что значение *name не возвращается.
modelBuilder.Entity<Expense>(entity =>
{
entity.HasKey(e => e.ExId);
entity.ToTable("expenses");
entity.Property(e => e.ExId).HasColumnName("ex_id");
entity.Property(e => e.Catg)
.HasColumnName("cat_id")
.HasConversion(
catg => new int(),
cat_id => new Catg
{
CatgId = cat_id
});
entity.Property(e => e.User)
.HasColumnName("user_id")
.HasConversion(
user => new int(),
user_id => new User
{
UserId = user_id
});
...
});
Как вывести именно поля с именами Catg и User? У меня пока только одна идея - создавать дочерние классы, где переопределять поле с кастомного типа на стандартный тип string специально для вывода списка. Если бы это был простой SQL, дело бы решилось join-ами. Но как правильно реализовать это в моем случае?
Ответы (1 шт):
Если я правильно понял, вам нужно изменить Expense следующим образом:
using System.ComponentModel; //Browsable
using System.ComponentModel.DataAnnotations; //NotMapped
using System.ComponentModel.DataAnnotations.Schema; //NotMapped
[Browsable(false)] public Catg Catg { get; set; } //чтобы не отображалось в DataGrid
[NotMapped] public string CatgName { get => Catg?.CatgName; } //линкуем имя для отображения в DataGrid
[Browsable(false)] public User User { get; set; }
[NotMapped] public string Username { get => User?.Username; }
Я читаю базу данным образом:
public List<Expense> GetExpences(ApplicationDbContext db)
{
return db.Expenses //получить сущность Expense
.Include(p => p.Catg) //включить сущность Catg
.Include(p => p.User) //включить сущность User
.ToList(); //вернуть всех Expense
}
PS Не очень понимаю зачем вы так описали Entity и может ли он вернуть связанные сущности и тем более связанные с ними свойства "name", но попробуйте описанный пример.