【发布时间】:2014-02-12 21:20:42
【问题描述】:
我有两个班级:
public partial class ObjectiveDetail {
public ObjectiveDetail() {
this.SubTopics = new List<SubTopic>();
}
public int ObjectiveDetailId { get; set; }
public int Number { get; set; }
public string Text { get; set; }
public virtual ICollection<SubTopic> SubTopics { get; set; }
}
public partial class SubTopic {
public int SubTopicId { get; set; }
public string Name { get; set; }
}
我有一个来自用户的 ObjectiveDetail 对象:
var web = {
"objectiveDetailId":1,
"number":1,
"text":"datafromweb",
"subTopics":[
{"subTopicId":1,
"name":"one"
},
{"subTopicId":3,
"name":"three",
}
]
}
还有来自数据库的 ObjectiveDetail:
var db = {
"objectiveDetailId":1,
"number":1,
"text":"datafromdb",
"subTopics":[
{"subTopicId":1,
"name":"one"
},
{"subTopicId":2,
"name":"two",
}
]
}
使用 Entity Framework 6,我知道我可以使用以下方法更新 ObjectiveDetail 类中的文本:
_uow.ObjectiveDetails.Update(web));
但是如何在连接这两个表的多对多表中更新对 ObjectiveDetail 和 SubTopics 的引用。例如,在这里我想要它,以便将 ObjectiveDetail 1 的多对多更改为引用 subTopicId 1 和 3 而不是值 1 和 2。请注意,ObjectiveDetail 和 SubTopic 存储在表中,它们之间有另一个表。这是 DDL:
CREATE TABLE [dbo].[ObjectiveDetail] (
[ObjectiveDetailId] INT IDENTITY (1, 1) NOT NULL,
[Text] NVARCHAR (MAX) NOT NULL,
[ObjectiveTopicId] INT NULL,
CONSTRAINT [PK_ObjectiveDetail] PRIMARY KEY CLUSTERED ([ObjectiveDetailId] ASC),
);
CREATE TABLE [dbo].[ObjectiveTopic] (
[ObjectiveDetailId] INT NOT NULL,
[SubTopicId] INT NOT NULL,
CONSTRAINT [FK_ObjectiveTopicObjectiveDetail] FOREIGN KEY ([ObjectiveDetailId]) REFERENCES [dbo].[ObjectiveDetail] ([ObjectiveDetailId]),
CONSTRAINT [FK_ObjectiveTopicSubTopic] FOREIGN KEY ([SubTopicId]) REFERENCES [dbo].[SubTopic] ([SubTopicId])
);
CREATE TABLE [dbo].[SubTopic] (
[SubTopicId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (150) NOT NULL,
CONSTRAINT [PK_SubTopic] PRIMARY KEY CLUSTERED ([SubTopicId] ASC),
);
这是我拥有的 EF 映射:
public class ObjectiveDetailMap : EntityTypeConfiguration<ObjectiveDetail>
{
public ObjectiveDetailMap()
{
// Primary Key
this.HasKey(t => t.ObjectiveDetailId);
// Relationships
this.HasMany(t => t.SubTopics)
.WithMany(t => t.ObjectiveDetails)
.Map(m =>
{
m.ToTable("ObjectiveTopic");
m.MapLeftKey("ObjectiveDetailId");
m.MapRightKey("SubTopicId");
});
}
}
【问题讨论】:
-
您可能想在
ObjectiveTopic表上放置一个主键或索引或两个或其他东西... -
其他人在这里问了同样的问题:stackoverflow.com/questions/21274521/…
-
@Moho - 另一个问题来自我的办公室伙伴。她问如何找出哪些物体不同。这个问题是关于如何进行更新的。我们仍在查看您的答案。一旦我们确定要做什么,我们就会接受这个问题的答案。感谢您的帮助。
标签: c# asp.net asp.net-mvc entity-framework entity-framework-6