2015-09-15 4 views
2

Я создаю модель сущности, в которой я хочу поместить не отображаемые свойства. Эти свойства позволяют упростить доступ к значениям из отношения. Показанная модель - всего лишь простой пример. Example modelEntity Framework, не отображаемое свойство в запросе

В users_roles сущности, названный UserRole, я хочу иметь UserName собственности и RoleName.

public class UserRole 
{ 
    public int Id { get; set; } 
    public int IdUser { get; set; } 
    public int IdRole { get; set; } 

    public User User { get; set; } 
    public Role Role { get; set; } 

    [NotMapped] 
    public string UserName 
    { 
     get { return User.Name; } 
    } 
    [NotMapped] 
    public string RoleName 
    { 
     get { return Role.Name; } 
    } 
} 

Это важно для меня, для будущей фильтрации, привязки данных и т.д. Я не настаиваю на таком решении. Это всего лишь первая идея.

На данный момент, если я пытаюсь фильтровать объекты по UserName или RoleName У меня есть исключение, потому что NotMapped объектов в базе данных не существует.

Вторая вещь получает значение свойств после того, как DbContext распоряжаться. На данный момент я использую метод .Include() (Eager Loading), но можно ли одним способом получить обе вышеперечисленную функциональность (filterint и т. Д.)?

Edit 1: Я использую Code First стратегию создания модели. Edit 2: Ok, чтобы уточнить, самый основной ответ должен создать метод фильтрации, как этот

public IQueryable<UserRole> Filter(IQueryable<UserRole> query, string userName, string roleName) 
{ 
    return query.Where(x => x.User.Name.Contains(userName) && x.Role.Name.Contains(roleName)); 
} 
+0

Вы добавили эти свойства через конструктора !!! вы должны добавить его вручную в класс, а не в designer.desginer ожидает отображения/моделирования базы данных для вещей, которые он показывает. –

+0

Нет, это стратегия «Code First», поэтому у меня нет дизайнера. Я забыл написать. –

+0

фильтрация не будет работать с Linq-to-entity, но, конечно же, используя linq для объектов, проверьте это - http://stackoverflow.com/questions/6065201/entity-framework-4-1-code-first-mapping-populating -a-single-property-from-two-db –

ответ

1

В принципе, если вы будете делать что-то вроде

Context.UserRole.Where(x=>x.UserName == "login") 

вы будете иметь исключение, как вы описали. Вы можете добиться этого, используя

Context.UserRole.Include(x=>x.User).Where(x=>x.User.Name == "login") 
+0

Хорошо, это так я использовал до сих пор. В принципе, приведенный выше пример очень прост, и, конечно, ваш ответ для этого велик, но когда мне нужно объединить строки из двух связанных сущностей и проверить, существует ли каждый из них каждый раз, когда я хочу получить значение, чем это проблематично. Может быть, нет другого решения :) Чтобы уточнить 'Context.UserRole.Where (x => (x.User! = Null? X.User.Name +" ":" ") + x.Role.Name ==" sth «)'. Могут быть более сложные запросы. –

+0

Не могу понять, почему вам нужно делать фильтрацию следующим образом. Вы суммируете «Собаки» и «Утки». Лучшее решение будет выглядеть следующим образом: Context.UserRole.Where (x => x.User.Name ==/null или что-то /). Где (x => x.Role.Name == "sth") –

+0

Возможно, это будет лучший пример (но без нулевой проверки). 'Context.User.Where (x => x.FirstName +" "+ x.LastName ==" FullName ")'. Это полное имя является значением из одного текстового поля. –

Смежные вопросы