2016-08-02 3 views
0

Скажут, у нас есть проект с этим лицами:Entity Framework кода первый, получить доступ к внешнему ключу значению

class User 
{ 
    public Guid Id { get; set; } 
    public List<Message> Messages { get; set; } 
    ... 
} 

class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 
} 

Теперь рассмотрит scenerio, где я хочу, чтобы получить все сообщения, которые разместили определенный пользователь, как может один достигает этого, не вытягивая информацию пользователя? (без использования context.Users.Include (...))? Я знаю, что инфраструктура сущности создает столбец в таблице сообщений, который содержит идентификатор пользователя, разместившего это сообщение, но как я могу получить доступ к этому значению? поскольку это не свойство в моем первоначальном классе.

ответ

2

Вы можете добавить свойство навигации в Message класс:

public class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 

    public virtual User User { get; set; } 
} 

И тогда опрашивать контекст так:

var userMessages = context.Messages 
    .Where(m => m.User.Id == 5); 

Это аккуратнее способ сделать это. С другой стороны, вы могли бы начать с пользователем, но это немного неудобно:

var userMessages = context.Users 
    .Where(u => u.Id == 5) 
    .SelectMany(u => u.Messages); 

Оба метода, в конечном счете производят подобный SQL, что-то вроде этого:

SELECT [Extent1].[Column1], 
     [Extent1].[Column2], 
     [Extent1].[Column3] 
FROM [dbo].[Messages] AS [Extent1] 
WHERE 5 = [Extent1].[UserId] 
+0

Hey DavidG! в чем разница между использованием аннотации ForeignKey против ее не использования? –

+0

На самом деле нет никакой разницы, если вы хотите быть явным, тогда не стесняйтесь добавлять его. Фактически вам не нужен атрибут, поскольку Entity Framework, по соглашению, сопоставляет свойство навигации 'User' в поле Id называемый 'UserId'. – DavidG

+0

Создает ли это связь между двумя объектами? удаление одного из них приведет к удалению другого? –

0

Вы можете Явно определить FK так что вам не нужно разрешать объект User.

class Message 
{ 
    public Guid Id { get; set; } 
    public string Message { get; set; } 

    public int UserID { get; set; } 
    [ForeignKey("UserID")] 
    public virtual User User { get; set; } 
} 

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

+0

Эй, Юшатак! в чем разница между использованием аннотации ForeignKey против ее не использования (но оставляя виртуальную запись, например, DavidG)? –

+0

Если вы используете аннотацию, вы создаете свойство ключа * доступного ключа (в данном случае UserID), которое вы можете читать/писать/манипулировать. Если вы не используете аннотацию, это происходит за кадром и не предоставляется вам через EF для управления. – Yushatak

+0

Очевидно, что руководство FK не требуется, поскольку выражение разрешает использовать свойство ID в любом случае в EF (на DavidG). – Yushatak

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