[英]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.