[英]How do I insert into a join table in Entity Framework?
大家好,
我目前正忙於為我們辦公室的團隊編寫一個 email 管理程序。
我目前面臨的問題是插入連接表。
設置如下:
{
[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.