将ICollection <int>属性设置为EntityTypeConfiguration类中的ICollection <user>的外键</user> </int>

时间:2014-09-05 09:36:06

标签: c# entity-framework ef-code-first

我正在使用.NET Framework 4.5.1和C#开发和实体框架代码第一6.1.0库。

我有这堂课:

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类实例,我可以使用UserIdSender属性设置消息&#39;发件人。我也可以使用GroupIdFromGroup执行相同操作。

但是,如果我想设置用户的收件人,我必须设置Users' class个实例,但我无法使用用户&#39; IDS。

我该怎么做?

我的问题是,我不知道如何告诉E.F.那些ID是Recipients&#39;像我对SenderUserId所做的外键:

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

我想在Message类创建一个新属性:

public ICollection<int> RecipientsId;

因为我想创建一个新的邮件类实例,并使用用户ID设置收件人。

我不知道如何修改EntityTypeConfiguration以告诉E.F.新的ICollection<int> RecipientsId属性具有ICollection<User> Recipients的外键。

注意:我将在ASP.NET Web API 2服务上使用此库,并且我希望将int值作为收件人发送,而不是发送{{ 1}}实例。

2 个答案:

答案 0 :(得分:0)

Recipients.Select(x => x.UserId)将返回一个int值列表。如果你想在模型上使用它,那么只需创建一个属性,如下所示。

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

由于此属性只有一个getter,因此不应尝试将其映射到数据库字段。

答案 1 :(得分:0)

我尝试了几个小时后,传递int无法完成,或者你可以通过FindBy UserId添加用户

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

ps:对不起我在上一篇文章中的错误。