none
请问向列表插入数据时如何避免列表被全部读取一遍? RRS feed

  • 问题

  •  

        public class EntityWithGuid : IEntity<Guid>

        {

            protected Guid _Id;

            /// <summary>

            /// Id

            /// </summary>

            public virtual Guid Id

            {

                get

                {

                    if (this._Id.IsEmpty())

                        this._Id = Guid.NewGuid();

     

                    return this._Id;

                }

                protected set

                {

                    this._Id = value;

                }

            }

        }

     

        public class Module :EntityWithGuid

        {

            public Module(string Name, string Key)

            {

                this.Pages = new HashSet<Page>();

                this.Name = Name;

                this.Key = Key;

            }

     

     

            public Module() { }

     

            private string _Key = "";

            public string Key

            {

                get

                {

                    return this._Key;

                }

                set

                {

                    this._Key = value ?? string.Empty;

                }

            }

     

            private string _Name = "";

            public string Name

            {

                get

                {

                    return this._Name;

                }

                set

                {

                    this._Name = value ?? string.Empty; ;

                }

            }

     

            public virtual ISet<Page> Pages { get; private set; }

        }

     

        public class Page : EntityWithGuid

        {

            public Page(string Url, string Name)

            {

                this.Helps = new HashSet<Help>();

                this.Url = Url;

                this.Name = Name;

            }

     

            private Page() { }

     

            private string _Url;

            public string Url

            {

                get

                {

                    return this._Url;

                }

                set

                {

                    this._Url = value;

                }

            }

     

            private string _Name;

            public string Name

            {

                get

                {

                    return this._Name.IsEmpty() ? this.Url : this._Name;

                }

                set

                {

                    this._Name = value ?? string.Empty; ;

                }

            }

     

            public virtual Module Module { get; set; }

     

        }

     

     

    结构是这样的,Module和Page的关系是一对多

     

                modelBuilder.Entity<Page>()

                    .HasRequired<Module>(t => t.Module)

                    .WithMany(t => t.Pages);

     

    对象里并没有外键。

     

    我是这样把页面加进去的。

     

                Module ModuleInfo = this.DBContext.Modules.SingleOrDefault(t => t.Key == ModuleKey);

                if (ModuleInfo == null)

                    return;

     

                ModuleInfo.Pages.Add(new Page(PageUrl, string.Empty));

     

    这么写的时候我感觉Pages属性在访问的时候会即将整个列表都读进来。

     

    果然从Sql Server Profiler看到是这种情况。

     

    请问有没有办法在插入、删除、更新的时候不去整个读取这个列表?

     

    或者在不使用外键的情况下有没有更好的办法。

     

    Id这个属性在我的程序里是没有意义的。

     

    谢谢

    2011年6月7日 2:25

答案

  • 刚才在网上查了一个方法大概是这样的。

    Module ModuleInfo = this.DBContext.Modules.SingleOrDefault(t => t.Key == ModuleKey);

                if (ModuleInfo == null)

                    return;

     this.DBContext.Pages.Add(new Page(PageUrl,string.Empty){Module=ModuleInfo});

    不过总感觉手动绑定这个关系有点别扭,有更好的方法吗?

    2011年6月7日 3:17

全部回复

  • 刚才在网上查了一个方法大概是这样的。

    Module ModuleInfo = this.DBContext.Modules.SingleOrDefault(t => t.Key == ModuleKey);

                if (ModuleInfo == null)

                    return;

     this.DBContext.Pages.Add(new Page(PageUrl,string.Empty){Module=ModuleInfo});

    不过总感觉手动绑定这个关系有点别扭,有更好的方法吗?

    2011年6月7日 3:17
  • 跟这个没关系,可以对最新取的Id做记录,存在缓存或者静态变量里面,直接用ajax获取新的数据,添加到页面上
    2011年6月7日 14:27
  • 我觉得您根本没搞清楚我在问什么。
    2011年6月8日 0:44