日期:2014-05-20  浏览次数:20603 次

求教WCF和LinqToSQL处理多表关联问题。
首先在WCF中不能返回有多表关联的表,其次不能修改有多表关联表的记录。求教以下解决方案。

------解决方案--------------------
“镰刀”让楼主头脑发热,希望用镰刀练出葵花宝典。

这个热情不错,不过我会把目标关注在其它地方。
------解决方案--------------------
7楼说得很对, WCF 可以说是和 Linq to SQL 没有直接关系的。

楼主,由于我早就不用 Linq to SQL 了,代码也不好找,关于“离线实体反序列化后更新子表”的代码一时也没有找到完整版,暂只找到一个:

首先要说明一下: 主表、子表的主键字段均要设置“时间戳(即 Version 属性)”为 true,这很重要。

主表为 TMaster,子表为 TDetail, TDetail 的主键为int型,首先要先得到 子表 的哪些主键是新增的、更改的、删除的(上班中时间有限,就不写这些代码了)。
C# code

        /// <summary>
        /// 更新由反序列化后得到的“离线”实体 TMaster。
        /// 首先要先得到 子表 的哪些主键是新增的、更改的、删除的
        /// </summary>
        /// <param name="detachedMaster"></param>
        /// <param name="insertedIds"></param>
        /// <param name="updatedIds"></param>
        /// <param name="deletedIds"></param>
        /// <returns></returns>
        bool UpdateDetachedMaster(TMaster detachedMaster, int[] insertedIds, int[] updatedIds, int[] deletedIds)
        {
            using (DbDataContext db = new DbDataContext( connection )
            {
                foreach (int detailId in insertedIds)
                {
                    db.TDetail.InsertOnSubmit(detachedMaster.TDetail.First(detail => detail.detailId == detailId));
                }
                foreach (int detailId in updatedIds)
                {
                    db.TDetail.Attach(detachedMaster.TDetail.First(detail => detail.detailId == detailId), true);
                }
                foreach (int detailId in deletedIds)
                {
                    db.TDetail.DeleteOnSubmit(detachedMaster.TDetail.First(detail => detail.detailId == detailId));
                }
                db.TMaster.Attach(detachedMaster, true);

                // 可以获取 db.GetChangeSet() 进行日志操作等;
                db.SubmitChanges();
            }
            return true;
        }