Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# linq更新不工作_C#_Linq - Fatal编程技术网

C# linq更新不工作

C# linq更新不工作,c#,linq,C#,Linq,我试了很多,但都没有成功。 我已经编写了LINQ代码,但无法保存数据库中的更改。 它没有给出错误,也没有更新记录 class Program { [Table(Name = "mainframe_replication")] public class mainframe_replication { private string _REPL_GUID; [Column(IsPrimaryKey = true, Storage = "_REPL

我试了很多,但都没有成功。 我已经编写了LINQ代码,但无法保存数据库中的更改。 它没有给出错误,也没有更新记录

class Program
{
    [Table(Name = "mainframe_replication")]
    public class mainframe_replication
    {
        private string _REPL_GUID;
        [Column(IsPrimaryKey = true, Storage = "_REPL_GUID")]
        public string REPL_GUID
        {
            get { return this._REPL_GUID; }
            set { this._REPL_GUID = value; }
        }

        private string _REPL_TYPE;
        [Column(Storage = "_REPL_TYPE")]
        public string REPL_TYPE
        {
            get { return this._REPL_TYPE; }
            set { this._REPL_TYPE = value; }
        }

        private string _RPT_ID;
        [Column(Storage = "_RPT_ID")]
        public string RPT_ID
        {
            get { return this._RPT_ID; }
            set { this._RPT_ID = value; }
        }

        private string _RPT_VERS;
        [Column(Storage = "_RPT_VERS")]
        public string RPT_VERS
        {
            get { return this._RPT_VERS; }
            set { this._RPT_VERS = value; }
        }

        private string _RPT_BYTES;
        [Column(Storage = "_RPT_BYTES")]
        public string RPT_BYTES
        {
            get { return this._RPT_BYTES; }
            set { this._RPT_BYTES = value; }
        }

        private string _REPL_DTM;
        [Column(Storage = "_REPL_DTM")]
        public string REPL_DTM
        {
            get { return this._REPL_DTM; }
            set { this._REPL_DTM = value; }
        }

        private string _NOTIF_ID;
        [Column(Storage = "_NOTIF_ID")]
        public string NOTIF_ID
        {
            get { return this._NOTIF_ID; }
            set { this._NOTIF_ID = value; }
        }
    }

    public class MyPoco
    {
        public string ReportId { get; set; }
        public string Reportversion { get; set; }
        public string ReportBytes { get; set; }
        public string ReportDate { get; set; }
        public string NotifId { get; set; }
        public string RecipAdd { get; set; }
    }

    public static string loglocation;
    static void Main(string[] args)
    {
        try
        {
            using (DataClasses1DataContext db = new DataClasses1DataContext())
            {
                Table<NOTIF_RECIP> NOTIF_RECIP_alias = db.GetTable<NOTIF_RECIP>();
                Table<NOTIF_SCHED> NOTIF_SCHED_alias = db.GetTable<NOTIF_SCHED>();
                Table<mainframe_replication> mainframe_replication_alias = db.GetTable<mainframe_replication>();

                var ids = NOTIF_SCHED_alias.Select(x => x.NOTIF_RPT_ID).ToArray();

                foreach (string notif_sched_data in ids)
                {
                    var repljoinmf = mainframe_replication_alias
                        .Join(NOTIF_RECIP_alias, mfr => mfr.RPT_ID, nr => nr.NOTIF_RECIP_ID, (mfr, nr)
                            => new MyPoco { ReportId = mfr.RPT_ID, Reportversion = mfr.RPT_VERS, ReportBytes = mfr.RPT_BYTES.ToString(), ReportDate = mfr.REPL_DTM.ToString(), NotifId = mfr.NOTIF_ID, RecipAdd = nr.NOTIF_RECIP_ADDR });

                    foreach (var repljoinmf_data in repljoinmf)
                    {
                        repljoinmf_data.NotifId = "abc";

                        //DO STUFF 
                        //  repljoinmf_data.NotifId = "Changedxyz";
                    }
                    db.SubmitChanges();
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
    }
}
提交更改时不会出现任何错误。 我需要改变什么?
任何建议都会有帮助。

您正在修改MyPoco对象的属性。这只是您的表的一个表示形式。这就是数据库没有更新的原因

您可以将MyPoco发送给您的客户。它将执行一些更改。然后可以重新创建实体并从Poco对象复制属性。然后,需要将修改后的实体添加到表中,然后保存更改


如果您直接修改实体,则无需附加,因为假设您使用相同的Databasecontext,它将保留到数据库的链接。

如果您希望将更改保存回原始数据源,则需要使用实际实体,而不是这些实体的投影。由于要连接两个表,一个选项是将这些实例放入匿名类型并更新它们:

foreach (string notif_sched_data in ids)
{
    var repljoinmf = mainframe_replication_alias
        .Join(NOTIF_RECIP_alias, 
              mfr => mfr.RPT_ID, 
              nr => nr.NOTIF_RECIP_ID, 
              (mfr, nr) => new {mfr, nr});

    foreach (var repljoinmf_data in repljoinmf)
    {
        //DO STUFF 
        repljoinmf_data.mfr.NotifId = "Changedxyz";
    }
    db.SubmitChanges();

在前面的问题中,您被告知匿名类型不能被中断,但在本例中,您正在修改匿名类型引用的实例。所以你没有更新匿名类型本身,只是更新匿名类型引用的对象。

你真的应该只显示一小部分代码,这太多了。事实上,我认为人们的第一条评论是关于缺少主键,所以ai在这里添加了整段代码以显示我有主键。谢谢你的建议,我将删除不需要的代码。您正在创建一个与数据库无关的MyPoco实例-如果要更新数据库,您需要使用实体类型,而不是从数据中投影的其他类型。一些格式建议:如果有行,请使用一行分隔符,如果您将代码垂直排列在同一执行范围内,那么阅读起来就不容易了。不要太缩进much@DStanley-当然,我会记住契约,但我不知道我应该做什么来进行更新。更多的澄清会有很大帮助。有什么建议我应该更改吗?对于每个想要更新的实体,显然在提交更改之前,你必须告诉实体框架实体已更新。除非您另有说明,否则我认为EF不会关注这些实体。因此,请遵循Kryptos提供的文章,您应该可以。@hbulens OP使用的不是EF,而是System.Data.Linq,即LinqToSQL。不管怎么说,这些概念都是一样的。你真好。非常感谢,先生。我不知道我为什么要用投影。谢谢