folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder C# Entityframework6 Datagridviewcomboboxcolumn İle Update Edemem Sorunu



C# Entityframework6 Datagridviewcomboboxcolumn İle Update Edemem Sorunu

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Bir kac gundur bu sorunla ugrasiyorum. Gozden kacirdigim bir nokta olmali muhakkak.

    DataGridView icinde DataGridViewComboBoxColumn lar var. EntityFramework6 ile bilgileri cekebiliyorum ve gosterebiliyorum. Grid icindeki ComboBoxlara ayri bir bindignsource vererek kullaniciya editleme kolayligi saglamak istiyorum. Lakin

    db.Products.Attach(obj);
    db.Entry(obj).State = System.Data.Entity.EntityState.Modified;
    db.SaveChanges();

    dedigimde
    A referential integrity constraint violation occurred: The property value(s) of 'ProductCategory.ProductCategoryID' on one end of a relationship do not match the property value(s) of 'Product.ProductCategoryID' on the other end.

    hatasi aliyorum.


    normal sekilde update edebiliyorum fakat ben bindingsource teki Currenti kullanarak yapmaya calisiyorum ve bu sorun ortaya cikti.

    Sorun ne acaba ?
    Iki taraftaki Keylerin ayni olmadigini soyluyor.

     


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    zeybekustasi
    zeybekustasi's avatar
    Kayıt Tarihi: 24/Mayıs/2012
    Erkek

    Selam hocam,

    PK -> FK bağlantısı kurmuşsun.

    Product taki CategoryID ProductCategory tablosunda bulunmuyor. 


    https://www.youtube.com/watch?v=WC3-71NKwPw
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek
    zeybekustasi bunu yazdı

    Selam hocam,

    PK -> FK bağlantısı kurmuşsun.

    Product taki CategoryID ProductCategory tablosunda bulunmuyor. 

    Hocam CategoryID DB de ProductCateogry tablosunda bulunuyor ama...

    Olay su hocam.

    mavi okla gorunen yere ayri bindingsource

    diger combolar icinde 2 tane ayri bidnin source kullaniorum. ACaba sorun burada mi ?


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Siz nasil hallediyorsunuz bu update olayini ef 6 da comboboxcolumn ile


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    selam hocam,

     

    parametre olarak verdigin obj nesnesi product tablosundakini tam olarak karsilamiyor. Anladigim kadariyla bu obj, gridview indeki bir kolonu temsil ediyor ve orada iki farkli binding kullandigin icin eslesme olmuyor. Sana tavsiyem bir tane class converter yazman. Bu obj yi verip sana salt product tablosuna uygun product sinifinin bir örnegini (instance) döndersin. Product instance da bahsettigin kategori ID yi deger olarak verirsin.  

    Ikinci olarak obj yi product class ine cast etmeyi bir dene, eger ederse category id sine bak nasil görünüyor. Eger sistem anladigim gibiyse cast edemeyecek.

     

     

    Diger soruna gelince; her farkli tablo icin ayri ayri crud kodu yazman gerek yok. Asagida kullandigim generic bir kod var. Bu metodlar tüm tablolarindaki verilere islem yapinca kullanabilirsin. Kafan biraz karisabilir belki ama kullanimi cok zor degil. Buraya adim adim yazayim..

     

    Adim 1:

    Ilk basta bir  GenericRepository   abstract class imizi ve onun Interface'i olan IGenericRepository i yaratalim. Bu class bizim icin CRUD islemlerini yapiyor ve ayni zamanda ben ekstra bir kac fonksiyon daha ekledim. Mesela GetAll, FindBy, FindFirst gibi.. Senin de isine yarayacak genel olarak kullanacagin db islemi ile ilgili fonksiyonunu buraya yazabilirsin. Mesela verilen tablodaki kayit sayisini dönderen fonksiyon ya da son elemani dönderen fonksiyon gibi.. 

        public interface IGenericRepository where T : class
        {
    
            IQueryable GetAll();
            IQueryable FindBy(Expression<Func<T, bool>> predicate);
            T FindFirstBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate);
            T Add(T entity);
            void Delete(T entity);
            void Edit(T entity);
            int Save();
        }

     

     

    Bu da abstract classimiz

      public abstract class GenericRepository<C, T> :
         IGenericRepository
            where T : class
            where C : DbContext, new()
        {
    
            private C _entities = new C();
            public C Context
            {
    
                get { return _entities; }
                set { _entities = value; }
            }
    
            public virtual T GetById(int Id)
            {
    
               var query = _entities.Set().Find(Id);
                return query;
            }
    
    
            public virtual IQueryable GetAll()
            {
    
                IQueryable query = _entities.Set();
                return query;
            }
    
            public IQueryable FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
            {
    
                IQueryable query = _entities.Set().Where(predicate);
                return query;
            }
    
    
            public T FindFirstBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
            {
    
                var query = _entities.Set().FirstOrDefault(predicate);
                return query;
            }
    
            public virtual T Add(T entity)
            {
                return   _entities.Set().Add(entity);
            }
    
            public virtual void Delete(T entity)
            {
                _entities.Set().Remove(entity);
            }
    
            public virtual void Edit(T entity)
            {
                _entities.Entry(entity).State = System.Data.EntityState.Modified;
            }
    
            public virtual int Save()
            {
                
              return  _entities.SaveChanges();
            }
    
            public virtual int Count()
            {
                return _entities.Set().Count();
            }
    
        }

     

    Adim 2:

    Daha sonra islem yapacagimiz class imiz icin bir interface olusturalim. Benim örnegimde Employee üzerine is yaptigi icin  EmployeeService   ve onun interface i IEmployeeRepository .

    Bir kac fonksiyon örnek de ekledim. Nasil kullanildigini görebilirsin. 

    Ilk önce yine interfaceimizi olusturalim

      
      
    public interface IEmployeeRepository : IGenericRepository
        {
    
            Employee EmployeeLoginByEmail(string email, string password);
            GeneralDefinitions.OperationResult CreateNewEmployee(Employee newEmployee, int adminId, int customerId);
            GeneralDefinitions.OperationResult EditEmployee(Employee emp, bool isDelete, int adminId, int customerId);
            List GetEmployeesByCustomerId(int customerId)
    
        }  

     

     

    ve simdi de is yapan classimizi ekleyelim. Metod aciklamalarini vs siliyorum cok yer kaplamasin diye

     

     public class EmployeeService : GenericRepository<MyEntities, employee>, IEmployeeRepository
        {
    
    
            public Employee EmployeeLoginByEmail(string email, string password)
            {
                var employee = FindFirstBy(e => e.Email == email && e.Password == password);
                var empResult = CheckLoginStatus(employee);
                return empResult;
            }
    
    
    
            public GeneralDefinitions.OperationResult CreateNewEmployee(Employee newEmployee, int adminId, int customerId)
            {
                if (!IsAdmin(adminId, customerId))
                    return GeneralDefinitions.OperationResult.PermissionRequires;
    
                Add(SurrogateTool.GetDataEmployeeByEmployee(newEmployee));
    
                return Save() > 0 ? GeneralDefinitions.OperationResult.Successful : GeneralDefinitions.OperationResult.Failed;
            }
    
    
            public GeneralDefinitions.OperationResult EditEmployee(Employee emp, bool isDelete, int adminId, int customerId)
            {
                if (isDelete)
                {
    
                    if (emp.Role == RoleType.CustomerMainAdmin)
                    {
                        if (!IsSiteAdmin(adminId))
                            return GeneralDefinitions.OperationResult.PermissionRequires;
                    }
                    else
                    {
                        if (!IsAdmin(adminId, customerId))
                            return GeneralDefinitions.OperationResult.PermissionRequires;
    
                        if (emp.EmployeeId == adminId)
                            return GeneralDefinitions.OperationResult.NotAllowed;
                    }
                }
    
                var employeeFromUser = SurrogateTool.GetDataEmployeeByEmployee(emp);
                Edit(employeeFromUser);
    
                return Save() > 0 ? GeneralDefinitions.OperationResult.Successful : GeneralDefinitions.OperationResult.Failed;
    
            }
    
    
            public List GetEmployeesByCustomerId(int customerId)
            {
                var employeList = FindBy(f => f.CustomerId == customerId).ToList();
                return SurrogateTool.GetEmployeeListByDataEmployeeList(employeList);
    
            }
        }

     

    Burada gördügün gibi yaptigim tek sey, IGenericRepository interface inde olan fonksiyonlari parametrelerle cagirmak. Bu olayi tüm entity class larim icin uygulayabilirim ve hepsinde ayni fonksiyonlari kullanabilirim. Burada dikkat etmen gereken en önemli sey. Eger DB ye bir sey yaziyorsan (insert-edit-delete), islemi yaptiktan sonra Save metodunu cagirmalisin. Save metodu da sana integer olarak islemin basarili olup olmadigini söylüyor. Eger 0 dan büyük ise islem basarilmis, degilse islem yapilmamis anlamindadir. Istiyorsan GenericRepository icerisinde her insert-update-delete metodunun sonunda Save metodunu cagirip ve sonucu öyle gönderebilirsin, sana kalmis. Ben bu sekilde yaptim. Avantaji su, mesela yeni bir kayit eklerken insert (add metoduyla), bana eklenen kaydi geri dönderiyor ve icerisinde ID si ile birlikte.. Bu tarz seyler kullaniyorsan ayri yapmak daha iyi olabilir.

     

    Umarim faydali olur örnek. Kolay gelsin

    Edit: Bir kac aciklama yapma geregi duydum

    MyEntities dedigim benim entity im adi, employee yazan da bu entity de var olan bir class (db deki Employee tablosuna karsilik geliyor) 

    SurrogateTool class i da benim icin class lari ceviyor. Mesela bazen atiyorum customer ile employee class inin bazi ögelerini birlestirmek istiyorum, ama db ye bu sekilde kayit edemeyecegim icin bana entity icin class lari dönderiyor.

    Baska sorun olursa sorabilirsin

     

    unbalanced tarafından 17/Haz/17 10:26 tarihinde düzenlenmiştir

    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    dhmm
    dhmm's avatar
    Kayıt Tarihi: 15/Eylül/2011
    Erkek

    Hocam sistem soyle

    BusinessLayer

     public static class ProductServices
    
    {
    
    public static bool Update(Product obj)
    
            {
    
                try               
    
                {                
    
                    if (HasAnotherSameProduct(obj))
    
                    {
    
                        Msg.Warning("Το προϊόν " + obj.Name.ToString() + " υπάρχει ηδη");
    
                    }
    
                    else
    
                    {
    
                        try
    
                        {
    
                            repository.Update(obj);
    
                            return true;
    
                        }
    
                        catch (Exception e)
    
                        {
    
                            return false;
    
                        }
    
                    }
    
                    return false;
    
                }
    
                catch(Exception e)
    
                {
    
                    StdMsg.CannotUpdate();
    
                    return false;
    
                }
    
            }
    
    }

    DataLayer

    public class ProductRepository : IProductRepository
    {
            public void Update(Product obj)
            {
                using (TiresEntities db = new TiresEntities())
                {
                    Product p = db.Products.Find(obj.ProductID);
                    p.ProductCategoryID = obj.ProductCategoryID;
                    p.SupplierID = obj.SupplierID;
                    p.IsActive = obj.IsActive;
                    p.Name = obj.Name;
                    p.Extra1 = obj.Extra1;
                    p.Extra2 = obj.Extra2;
                    p.Extra3 = obj.Extra3;                               
                    db.SaveChanges();
                }
            }
    }

    Bu ustteki en son yaptigim hali. Yan yoldan ama mecbur kaldim vermem gerekirdi musteriye.

    Ilk posttaki gibi Update fonksiyonunun icinde 

    db.Products.Attach(obj);
    db.Entry(obj).State = System.Data.Entity.EntityState.Modified;
    db.SaveChanges();

    kullaninca veriyordu.

    obj nesnesini direkt bindingSource.Current <- ten cast ederk aliyorum

    bindingSource.Current as Product diyerek.

     

    Bu arada yazdiklarin ilac gibi gelecek hocam sagol. T lari fln gordum ama bilmedigim ve kullanmadigim icin zmn kaybi yasarim diye hic dokunmadim.

     

     


    Ozgurluk aslinda her istedigini yapabilmek degildir, istemedigini yapmamaktir. // Verdigin degeri gormeyince, gordugun degeri ver !!! // Hayatin herkes icin bir bavulu vardir !!! // Dusmek gerekir bazen hayatta; kalkmayi ogrenebilmek icin
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    unbalanced
    unbalanced's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    ilginc bir sorun gibi geldi bana hocam.. Imkanin varsa obj.GetType() ile tam tipini ögrensene.. Bir sekilde bu iki nokta esit degil.. Ayrica bu obj ve p nesnelerini hem == hem de Equals ile karsilastirir misin? Bu ikisinin bire bir olmasina imkan yok, watch ile objelerin iceriklerine baktin mi hangi property degerlerini almis..

     


    Ülkesini Seven Her Türk Vatandasi, Ülkesinin Sessiz Istilasi'na karsi durmak zorunda.
Toplam Hit: 1592 Toplam Mesaj: 7
c# entity framework 6