首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ICollection<int>类中将ICollection<User>属性设置为外键为ICollection<User>

在ICollection<int>类中将ICollection<User>属性设置为外键为ICollection<User>
EN

Stack Overflow用户
提问于 2014-09-05 09:36:06
回答 2查看 365关注 0票数 0

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

我有一节课:

代码语言:javascript
复制
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; }
}

使用此配置类:

代码语言:javascript
复制
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属性设置消息的发件人。我也可以对GroupIdFromGroup做同样的事情。

但是,如果我想设置用户的收件人,我必须设置Users' class实例,但我不能使用用户的ids。

我怎么能这么做?

我的问题是我不知道如何告诉E.F.那些I是Recipients的外键,就像我和SenderUserId一样

代码语言:javascript
复制
HasRequired(m => m.Sender).
WithMany(u => u.MessagesSent).
HasForeignKey(m => m.UserId).
WillCascadeOnDelete(false);

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

代码语言:javascript
复制
public ICollection<int> RecipientsId;

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

我不知道如何修改EntityTypeConfiguration,告诉E.F.新的ICollection<int> RecipientsId属性拥有ICollection<User> Recipients的外国密钥。

注意事项:我将在ASP.NET Web 2服务上使用这个库,我希望将int值作为收件人发送,而不是发送User实例。

EN

回答 2

Stack Overflow用户

发布于 2014-09-05 09:59:25

Recipients.Select(x => x.UserId)将返回int值的列表。如果您希望在模型上这样做,那么只需创建一个属性如下所示。

代码语言:javascript
复制
IEnumerable<int> RecipientIds
{
    get
    {
        return Recipients.Select(x => x.UserId);
    }
}

由于此属性仅具有getter,因此EF不应尝试将其映射到DB字段。

票数 0
EN

Stack Overflow用户

发布于 2014-09-05 11:13:30

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

代码语言:javascript
复制
var user = context.Users.Find(UserId);
msg.UserReceipts.Add(User);

ps:对不起,我在前一篇文章中错了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25682841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档