繁体   English   中英

如何在 Entity Framework 中插入连接表?

[英]How do I insert into a join table in Entity Framework?

大家好,

我目前正忙于为我们办公室的团队编写一个 email 管理程序。

我目前面临的问题是插入连接表。

设置如下:

  • 我有一个名为 EmailDetails 的表(这基本上是与电子邮件相关的所有信息)
  • 一个名为 EmailUser 的表(这是一个包含将使用该应用程序的所有用户以及将成为收件人或抄送的用户的表)
  • 最后,一个名为 Email_EmailUser 的表(连接表,看到 EmailUser 和 EmailDetails 具有多对多关系)
  • 这是一种数据库优先的方法
{
    [Table("EmailDetails")]
    public class EmailDetails
    {

        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public long ID { set; get; }
        public string EmailHeading { set; get; }
        public string EmailBody { set; get; }
        public string EmailAttachment { set; get; }
        public string EmailAttachmentType { set; get; }
        public string EmailAttachmentPath { set; get; }
  
        public virtual ICollection<Email_EmailUser> Email_EmailUser { set; get; }

        public EmailDetails()
        {
            this.Email_EmailUser = new HashSet<Email_EmailUser>();
        }

        public EmailDetails(long ID, string emailHeading, string emailBody, string emailAttachment, string emailAttachmentType, string emailAttachmentPath)
        {

            this.Email_EmailUser = new HashSet<Email_EmailUser>();
            this.ID = ID;
            this.EmailHeading = emailHeading;
            this.EmailBody = emailBody;
            this.EmailAttachment = emailAttachment;
            this.EmailAttachmentType = emailAttachmentType;
            this.EmailAttachmentPath = emailAttachmentPath;
        }
    } 
}
{
    [Table("EmailUsers")]
    public class EmailUser : DbContext
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public long ID { set; get; }
        public string UserName { set; get; }
        public string UserEmail { set; get; }
        public int isActive { set; get; }

        public EmailUser()
        {
            this.Email_EmailUser = new HashSet<Email_EmailUser>();
        }


        public EmailUser(long id, string name, string email)
        {
            this.Email_EmailUser = new HashSet<Email_EmailUser>();
            this.ID = id;
            this.UserName = name;
            this.UserEmail = email;
            this.isActive = 1;
        }
   
        public virtual ICollection<Email_EmailUser> Email_EmailUser { set; get; }
    }
}
{
    [Table("Email_EmailUser")]
    public class Email_EmailUser
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public long ID { set; get; }
        public long EmailID { set; get; }
        public long EmailUserID { set; get;  } 
        public int IsCC { set; get; }

        public EmailUser EmailUser { set; get; }
        public EmailDetails EmailDetails { set; get; }

        public Email_EmailUser()
        {

        }

    }
}

在我的 controller 中,我正在尝试创建一个新的 email,特定用户也可以访问它。 即,需要创建一个新的 email,然后需要将一条记录插入到 Email_EmailDetails 中,其中包含新的 email id 以及当前用户的 id。

我的 controller:

            long newEmailID = GetNewEmailID();

            try
            {
                using (DatabaseContext db = new DatabaseContext())
                {
                    EmailDetails newEmail = new EmailDetails(newEmailID, emailHeading, emailBody, emailAttachment, emailAttachmentType, emailAttachmentPath);
                    db.EmailDetails.Add(newEmail);
                    db.SaveChanges();

                    Email_EmailUser emailEmailUser = new Email_EmailUser();

                    emailEmailUser.ID = newEmail_EmailUserID;
                    emailEmailUser.EmailID = newEmail.ID;
                    emailEmailUser.EmailUserID = user.ID;
                    emailEmailUser.IsCC = 1;
                    
                    db.Email_EmailUser.Add(emailEmailUser);
                    db.SaveChanges();
                }
                return true;
                //return email_EmailUser;
            }

运行此代码时,我收到以下错误:

System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. ---> System.Data.SqlClient.SqlException: Invalid column name 'EmailDetails_ID'.

我假设这个问题与 model 的设置方式有关,但是,我尝试了多个建议,但没有成功。

我还是 C# 和 EF 的新手,所以任何建议都将不胜感激。

如果您不需要包含IsCC属性,则通常在 DbContext 实例的OnModelCreating覆盖中配置DbContext (取决于您使用的 EF 版本 - EFCore 5+ 现在应该正确支持此功能):

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  modelBuilder.Entity<EmailDetails>()
    .HasMany(e => e.EmailUsers)
    .WithMany(u => u.EmailDetails)
    .Map(m =>
      {
        m.MapLeftKey("EmailID");
        m.MapRightKey("EmailUserID");
        m.ToTable("Email_EmailUser");
      });
}

对于我在连接表上运行类似的数据库没有唯一 ID,我只是使用两个 ID 的复合 ID。

但是,您的设置应该适用于其他字段 - 即您不能直接从 Email 导航到用户,但必须通过连接表 go 才能找到它们。

经过漫长而乏味的搜索,我想出了一些对我有用的东西。 出于某种原因,似乎 EF 正确执行了 map 密钥。

我最终在我的 class 中使用了一个简单的数据注释,代表我的连接表并解决了问题。

我的加入现在看起来像这样:

{
    [Table("Email_EmailUser")]
    public class Email_EmailUser
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        [Key]
        public long ID { set; get; }
        [ForeignKey("EmailDetails")]
        public long EmailID { set; get; }
        [ForeignKey("EmailUser")]
        public long EmailUserID { set; get;  } 
        public int IsCC { set; get; }
        public virtual EmailUser EmailUser { set; get; }
        public virtual EmailDetails EmailDetails { set; get; }

        public Email_EmailUser()
        {

        }

    }
}

感谢您的所有评论和支持。 我很感激所有的努力!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM