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,"text":"datafromdb",{"subtopicID":2,"name":"two",} ]}
使用实体框架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,[name] NVARCHAR (150) NOT NulL,CONSTRAINT [PK_Subtopic] PRIMARY KEY CLUSTERED ([SubtopicID] ASC),);
这是我有的EF MapPing:
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"); }); }}解决方法 我想您正在尝试模拟为您的用户工作的离线模式.所以当你从用户那里得到某些东西时,你想同步数据库和用户数据.我举一个例子,把你的问题从一步超越:)我添加了一个需要在数据库中更新的Subtopic.好的,这里是代码:
static voID Main(string[] args){ //the database var ObjectiveDetails = new List<ObjectiveDetail>() { new ObjectiveDetail() { ObjectiveDetailID = 1,Number = 1,Text = "datafromdb",Subtopics = new List<Subtopic>() { new Subtopic(){ SubtopicID = 1,name="one"},//no change new Subtopic(){ SubtopicID = 2,name="two"},//to be deleted new Subtopic(){ SubtopicID = 4,name="four"} //to be updated } } }; //the object comes as Json and serialized to defined object. var web = new ObjectiveDetail() { ObjectiveDetailID = 1,Text = "datafromweb",Subtopics = new List<Subtopic>() { new Subtopic(){ SubtopicID = 1,//no change new Subtopic(){ SubtopicID = 3,name="three"},//new row new Subtopic(){ SubtopicID = 4,name="new four"} //must be updated } }; var objDet = ObjectiveDetails.FirstOrDefault(x => x.ObjectiveDetailID == web.ObjectiveDetailID); if (objDet != null) { //you can use autoMapper or ValueInjecter for mapPing and binding same objects //but it is out of scope of this question //update ObjectDetail objDet.Number = web.Number; objDet.Text = web.Text; var subtops = objDet.Subtopics.ToList(); //Delete removed parameters from database //Entity framework can handle it for you via change tracking //subtopicID = 2 has been deleted subtops.RemoveAll(x => !web.Subtopics.Select(y => y.SubtopicID).Contains(x.SubtopicID)); //adds new items which comes from web //adds subtopicID = 3 to the List var newItems = web.Subtopics.Where(x => !subtops.Select(y => y.SubtopicID).Contains(x.SubtopicID)).ToList(); subtops.AddRange(newItems); //this items must be updated var updatedItems = web.Subtopics.Except(newItems).ToList(); foreach (var item in updatedItems) { var dbItem = subtops.First(x => x.SubtopicID == item.SubtopicID); dbItem.name = item.name; } //let's see is it working Console.Writeline("{0}:\t{1}\t{2}\n---------",objDet.ObjectiveDetailID,objDet.Number,objDet.Text); foreach (var item in subtops) { Console.Writeline("{0}: {1}",item.SubtopicID,item.name); } } else { //insert new ObjectiveDetail } //In real scenario after doing everything you need to call SaveChanges or it's equal in your Unit of Work.}
结果:
1: 1 datafromweb---------1: one4: new four3: three
而已.您可以像这样同步您的数据库和用户数据.而且AutoMapper和ValueInjecter都是非常有用和强大的工具,我深深的推荐你来看看那些.我希望你喜欢,快乐的编码:)
总结以上是内存溢出为你收集整理的c# – 如何使用EF6更新多个表全部内容,希望文章能够帮你解决c# – 如何使用EF6更新多个表所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)