重复的条目

时间:2009-10-29 19:47:44

标签: linq-to-sql model-view-controller

我创建了一个universalrepository,它接受传递给它的类型,当我创建数据输入方法时,实体创建得很好,但是当我创建一个链接实体时,我再次创建了基本实体。有什么想法吗?

详细..

我已将规范划分为多个表来管理内容......

现在我有一个人实体,一个申请实体......(实际上申请人和人是相同的),承包商实体。承包商只能由申请人创建,因此始终会创建申请人,因此始终会创建一个人。

当我继续创造一个人时,它可以创造一个人,但是当我创建一个申请人时,它会再创造一个人。同样,当我创建承包商时,由于某种原因,它会创建一个人和多个申请人。

这是我的LINQ to SQL。无论如何你都注意到我可以改进这个代码,我也会很感激。

这是存储库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq;

namespace ParkingPermit.Models
{
    public class UniversalManagerRepository<T> :IRepositoryT<T>
                                               where T:class
    {
        private Table<T> _table;
        private readonly DB _db ;//= new DB();

        public UniversalManagerRepository()
        {
            _db = new DB();
            _table = _db.GetTable<T>();
        }

        #region IRepositoryT<T> Members

        public T Create(T create)
        {

           // _table = new DB().GetTable<T>();

            //_db.GetTable(typeof(T)).InsertOnSubmit(create);

            _table.InsertOnSubmit(create);
            Save();

            return create;
        }

        public void Delete(T delete)
        {
            throw new NotImplementedException();
        }

        public T Edit(T edit)
        {
            throw new NotImplementedException();
        }

        public T GetItem(int id)
        {
            throw new NotImplementedException();
        }

        public T Update(T update)
        {
            throw new NotImplementedException();
        }

        public IEnumerable<T> List()
        {
            //IQueryable i = _db.GetTable(typeof(T)).AsQueryable()  ;
            return _db.GetTable(typeof(T)) as IEnumerable<T>;
            //throw new NotImplementedException();
        }

        public void Save()
        {
            //_db.SubmitChanges();
            _table.Context.SubmitChanges();
            //throw new NotImplementedException();
        }

        #endregion
    }
}

如果有帮助的话,我可以将linq的图像发布到sql设计器,但我不能在这里看到这个功能......

非常感谢alt text http://img509.imageshack.us/img509/2072/linq.jpg

事情是,当添加申请人并且申请人.Person从会话中分配时(在模型绑定器中),它创建一个新人,实际上是在开始时创建的原始人。我怎么能避免这种情况。

protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)  
{  
   var personType = (Person)controllerContext.HttpContext.Session[PersonSessionKey];  

   controllerContext.HttpContext.Session[CurrentApplicantSessionKey] = null;  

   var av = new ApplicantValidator(new            ModelStateWrapper(bindingContext.ModelState));  
   var newApplicant = bindingContext.Model as Applicant;  




   if (personType == null)  
   {  

       bindingContext.ModelState.AddModelError(bindingContext.ModelName,  

                                               "Cannot Update this Instance directly, please restart the application");  
      // controllerContext.HttpContext.Session[PersonSessionKey] = personType;  
   }  
   else if (newApplicant != null)  
   {  
       if (newApplicant.Person != null)  
       {  
           if (newApplicant.Person.Equals(personType as Person))  
           {  
               bindingContext.ModelState.AddModelError(bindingContext.ModelName,  
                                                       "A person with these details already exists, please restart the application...");  
               //return  
               controllerContext.HttpContext.Session[PersonSessionKey] = null;  
               personType = null;  
           }  
       }  
       else if (av.Validate(newApplicant))  
       {  

           if (newApplicant.Person == null)  
           {  

               newApplicant.Person = personType as Person;  
               newApplicant.PersonId = personType.PersonId;  


           }  
       }  

   }  

}  

1 个答案:

答案 0 :(得分:0)

我已经解决了这个部分,显然它现在发布了更新,可以找到任何不寻常的东西。

  1. 回答我的第一个问题,就是在模型绑定器中,实体正在从会话中被操纵,而创建的则返回到服务层。
  2. 显然,似乎因为它全部发生在linq orm框架之外,所以需要将此实体重新创建为“From子句......来自..in db”。然后linq正确识别它并完成正确的插入工作。

    任何人都可以帮我更新/编辑..请