c# – 如何使用EF6更新多个表

c# – 如何使用EF6更新多个表,第1张

概述我有两个班: public partial class ObjectiveDetail { public ObjectiveDetail() { this.SubTopics = new List<SubTopic>(); } public int ObjectiveDetailId { get; set; } public int Number { 我有两个班:
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更新多个表所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257774.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存