将现有实体添加到多对多关系的子集合中

时间:2016-08-02 13:06:57

标签: c# entity-framework

我必须代表MessageTopic的实体 Message可以有多个Topic,而Topic可以属于多个Message

public class Message
{
    [Key]
    public int Id { get; set; }

    public string Text { get; set; }

    public virtual ICollection<Message> Topics { get; set; }
}

public class Topic
{
    public int Id { get; set; }

    public string Value { get; set; }

    public virtual ICollection<Message> Messages { get; set; }
}

在我的应用程序中,我们首先保存Topic(在应用程序的早期,有时是种子数据等...)

稍后,我需要保存一个新的Message - 将已存在的Topic添加到子集合中;

var message = new Message();
message.Text = "Hello";
//this topic already exists in the database
message.Topics.Add(new Topic{Id = 6, Value = "val"}); 
dbContext.Messages.Add(message);
dbContext.SaveChanges();

会发生什么:

  • Message已保存
  • 创建新的主题(值为“val”)
  • 主题的ID将根据新创建的Message ID
  • 保存在MessageTopics映射表中

我想要发生的是

  • Message已保存
  • 提供的主题的ID(本例中为6)将根据新创建的Message ID
  • 保存在MessageTopics表中

1 个答案:

答案 0 :(得分:1)

第一个选项

如果所有内容都已正确映射,那么您唯一需要做的就是持有对主题的引用并将其状态设置为Unchanged

// This topic already exists in the database.
// No need to set value.
var topic = new Topic{ Id = 6 };
var message = new Message();
message.Text = "Hello"; 
message.Topics.Add(topic); 
dbContext.Messages.Add(message);

// Set state of topic to Unchanged
dbContext.Entry(topic).State = EntityState.Unchanged;
dbContext.SaveChanges();

第二个选项。

如果没有太多数据,只需从数据库中获取主题。

// Get topic from source
var topic = dbContext.Topics.FirstOrDefault(m => m.Id == 6);
var message = new Message();
message.Text = "Hello";
message.Topics.Add(topic); 
dbContext.Messages.Add(message);
dbContext.SaveChanges();