2014-09-05 2 views
0

Я разрабатываю и Entity Framework Code Первая библиотека 6.1.0 с .NET Framework 4.5.1 и C#.Set ICollection <int> Свойство как внешние ключи к ICollection <User> в EntityTypeConfiguration class

У меня есть этот класс:

public class Message 
{ 
    public int MessageId { get; set; } 
    public string Body { get; set; } 
    public DateTime DateSent { get; set; } 

    public Nullable<int> GroupId { get; set; } 
    public Group FromGroup { get; set; } 

    public int UserId { get; set; } 
    public User Sender { get; set; } 

    public ICollection<User> Recipients { get; set; } 
} 

С помощью этого класса конфигурации:

public class MessageConfiguration : EntityTypeConfiguration<Message> 
{ 
    public MessageConfiguration() 
    { 
     ToTable("Message"); 

     Property(m => m.Body).IsRequired(); 
     Property(m => m.Body).IsMaxLength(); 

     Property(m => m.DateSent).IsRequired(); 

     HasOptional(m => m.FromGroup). 
      WithMany(g => g.Messages). 
      HasForeignKey(m => m.GroupId); 

     HasRequired(m => m.Sender). 
      WithMany(u => u.MessagesSent). 
      HasForeignKey(m => m.UserId). 
      WillCascadeOnDelete(false); 

     HasMany(r => r.Recipients). 
      WithMany(m => m.MessagesReceived). 
      Map(mr => 
      { 
       mr.ToTable("MessageRecipient"); 
       mr.MapLeftKey("MessageId"); 
       mr.MapRightKey("UserId"); 
      }); 
    } 
} 

Как вы можете видеть, если создать новый Message экземпляр класса, я могу использовать UserId или Sender для установки отправителя сообщения. Я также могу сделать то же самое с GroupId и FromGroup.

Но, если я хочу установить получателей пользователя, мне нужно установить Users' class экземпляров, но я не могу использовать идентификаторы пользователей.

Как я могу это сделать?

Моя проблема заключается в том, что я не знаю, как сказать, что эти EF идентификаторов Recipients 'внешние ключи, как я сделал с Sender и UserId:

HasRequired(m => m.Sender). 
WithMany(u => u.MessagesSent). 
HasForeignKey(m => m.UserId). 
WillCascadeOnDelete(false); 

Я хочу, чтобы создать новое свойство на Message класса :

public ICollection<int> RecipientsId; 

потому что я хочу создать новый экземпляр класса сообщений и установить получателей с использованием идентификатора пользователя.

Я не знаю, как изменить EntityTypeConfiguration, чтобы сообщить E.F., что у этого нового свойства ICollection<int> RecipientsId есть внешние ключи ICollection<User> Recipients.

ПРИМЕЧАНИЕ: Я собираюсь использовать эту библиотеку на API 2 службы Web ASP.NET и я хочу, чтобы отправить int значения в качестве реципиентов, вместо отправки User экземпляров.

+1

Зачем вам нужно, 'общественного ICollection RecipientIds', у вас есть' ICollection Recipients', так что если вы хотите там идентификаторы вы можете просто использовать LINQ 'Recipients.Select (х => x.UserId)' –

+0

Пожалуйста, прочитайте записку в конце моего вопроса. Благодарю. – VansFannel

ответ

0

Recipients.Select(x => x.UserId) вернет список значений int. Если вы хотите это на своей модели, просто создайте свойство, как показано ниже.

IEnumerable<int> RecipientIds 
{ 
    get 
    { 
     return Recipients.Select(x => x.UserId); 
    } 
} 

Поскольку это свойство имеет только получателя, EF не следует пытаться сопоставить его с полем БД.

+0

Нет, я не прошу об этом. Я хочу создать новый экземпляр класса сообщений и установить получателей с помощью Идентификатора пользователя. – VansFannel

+0

Боюсь, я не понимаю, о чем вы спрашиваете. Чего вы пытаетесь достичь? –

+0

Если я создаю новое сообщение, я могу установить 'message.UserId = 1' вместо set' message.Sender = user1'. Я могу это сделать, потому что я задал 'MessageConfiguration', что свойство' Sender' имеет свойство 'UserId' в качестве внешнего ключа. Я хочу сделать то же самое с 'RecipientIds': установить идентификаторы реципиентов как значения' int' вместо того, чтобы создавать экземпляр 'User', чтобы сделать то же самое (указать, что они являются получателями). – VansFannel

0

после я пытаюсь часами, пройти int не может быть сделана, в качестве альтернативы вы можете добавить пользователя по FindBy UserId

var user = context.Users.Find(UserId); 
msg.UserReceipts.Add(User); 

пса: простите за мою ошибку в предыдущем сообщении.

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