簡體   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