1

My mappings:

 public class MessageMap : ClassMap<Message>
{
    public MessageMap()
    {
        Table("[Messages]");
        Id(x => x.Id).Column("id");
        References(x => x.From).Column("user_id");
        Map(x => x.Subject).Column("subject");
        Map(x => x.Body).Column("body");
        Map(x => x.DateSent).Column("date_sent");
        HasMany(x => x.Recipients).KeyColumn("message_id").AsBag().LazyLoad().Cascade.AllDeleteOrphan();
    }
}

public class MessageRecipientMap : ClassMap<MessageRecipient>
{
    public MessageRecipientMap()
    {
        Table("[MessageRecipients]");
        Id(x => x.Id).Column("id");
        References(x => x.To).Column("user_id");
        References(x => x.Message).Column("message_id");
        Map(x => x.IsRead).Column("is_read");
        Map(x => x.DateRead).Column("date_read");
    }
}

My models:

public class Message : IEntity
{
    public virtual Guid Id { get; set; }
    public virtual User From { get; set; }
    public virtual string Subject { get; set; }
    public virtual string Body { get; set; }
    public virtual DateTime DateSent { get; set; }
    public virtual IList<MessageRecipient> Recipients { get; set; }

    public Message()
    {
        Recipients = new List<MessageRecipient>();
    }
}

public class MessageRecipient : IEntity
{
    public virtual Guid Id { get; set; }
    public virtual User To { get; set; }
    public virtual bool IsRead { get; set; }
    public virtual DateTime DateRead { get; set; }
    public virtual Message Message { get; set; }
}

My ViewModel:

public class MessageModel
{
    [Required]
    public virtual Message Message { get; set; }

    public virtual IList<MessageRecipient> MessageRecipients { get; set; }
    public virtual string RecipientIds { get; set; }
    public virtual IList<UserLiteModel> AllowedMailingList { get; set; }
}

My Controller code:

public ActionResult Create(MessageModel model)
{
    var user = GetPrincipalUser();
    var sentDate = DateTime.Now;

    var message = new Message
    {
        From = user,
        DateSent = sentDate
    };
    var toUserIds = model.RecipientIds.Split(',').ToList();
    foreach (var uId in toUserIds)
    {
        var uGuid = Guid.Parse(uId);
        var messageRecipient = new MessageRecipient
        {
            To = _userService.Get(uGuid),
            IsRead = false,
            DateRead = sentDate
        };
        message.Recipients.Add(messageRecipient);
    }
    _messageService.Save(message);
    return RedirectToAction("Index");
}

My Issue:

When I save at my method in my controller, for MessageRecipients it is always null. Do I really have to save the message first then assign it. Seems like so much work. So let me rather post this message, seems like less work.

Jason
  • 41
  • 4
  • 1
    do you mean that this line (message.Recipients.Add(messageRecipient);) is giving a null reference exception or you mean that the recipients are not being created in the DB? – alaa_sayegh Oct 22 '17 at 19:14

1 Answers1

0

Click here to get the answer as this worked for me. This also uses the Inverse setting.

Jason
  • 41
  • 4