>

컨텍스트와 엔티티 객체를 매개 변수로 취하는 메소드가 있습니다. 이 메소드는 클래스 (테이블)의 공통 속성 (내 코드의 COID)에 값이 있는지 확인할 수 있어야합니다.

이 코드를 다시 작성하는 방법을 찾을 수 없어서 더 일반적이며 메소드에 전달 된 각 엔티티의 유형을 확인하고 있습니다.

   public async static Task<bool> IsCOIDAssigned(ProjectEntities _context, object _entity)
    {
        var bSuccess = false;
        //First type to check
        if (_entity is tblLine)
        {
            var _line = _entity as tblLine;
            await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
            {
                if (!x.IsFaulted)
                {
                    var query = from c in _context.tblLines
                                where c.ID.Equals(_line.ID)
                                select c;
                    if(query.Single().COID.GetValueOrDefault() == 0)
                    {
                        Console.WriteLine("Not assigned");
                        bSuccess = true;
                    }  
                    else
                    {
                        Console.WriteLine("Assigned");
                        bSuccess = false;
                    }
                }
                else
                {
                    bSuccess = false;
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());
        };
        //Second type to check
        if (_entity is tblDevice)
        {
            var _device = _entity as tblDevice;
            await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
            {
                if (!x.IsFaulted)
                {
                    var query = from c in _context.tblDevices
                                where c.ID.Equals(_device.ID)
                                select c;
                    if (query.Single().COID.GetValueOrDefault() == 0)
                    {
                        Console.WriteLine("Not assigned");
                        bSuccess = true;
                    }
                    else
                    {
                        Console.WriteLine("Assigned");
                        bSuccess = false;
                    }
                }
                else
                {
                    bSuccess = false;
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());
        };

        //Third type to check ....
        //Fourth type to check ....
        return bSuccess;
    }

문제에 대한 더 나은 해결책을 찾는 사람이 있습니까?


  • 답변 # 1

    나는 테이블을 tblBase로 만들기 위해 arekzyla의 솔루션을 따랐습니다. 그러나 데이터베이스 우선 모델이 있으므로 코드를 통해 모델을 수정할 수 없었습니다 (가능한지 확실하지 않습니까?)

    arekzyla 덕분에 내가 찾고있는 것을 얻을 수 있었지만 linq 쿼리가 적기 때문에 엔티티를 ID 및 COID (공통 테이블 속성)를 포함하는 클래스 인 TblBase로 캐스팅하고 있습니다.

    public static async Task<bool> IsEntityCheckedOut(ProjectEntities _context, object _entity)
        {
            var bCheckedOut = false;
            await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
            {
                if (!x.IsFaulted)
                {
                    var _baseentity = _entity as TblBase;
                    if (_baseentity.COID.GetValueOrDefault() != 0)
                    {
                        Console.WriteLine("Assigned");
                        bCheckedOut = true;
                    }
                    else
                    {
                        Console.WriteLine("Not Assigned");
                    }
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());
            return bCheckedOut;
        }
    
    

  • 답변 # 2

    적어도 COID 및 Id 속성을 포함하는 tblLine 및 tblDevice에 대한 기본 추상 클래스를 만들 수 있습니다.

    public abstract class TblBase
    {
        public int Id { get; set; }
        public int COID { get; set; }
        //other common properties
    }
    public class TblLine : TblBase
    {
        // properties
    }
    public class TblDevice : TblBase
    {
        // properties
    }
    
    

    따라서 문맥 상 다음과 같은 것이 있습니다 :

    public DbSet<TblBase> TblBases { get; set; }
    
    

    두 클래스에 대해 TPC (Concrete-Concrete-Type)로 상속을 설정해야합니다 :

    modelBuilder.Entity<TblLine>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("tblLines");
    });
    modelBuilder.Entity<TblDevice>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("tblDevices");
    });
    
    

    그런 다음 context.TblBases를 사용하여 데이터를 쿼리 할 수 ​​있습니다.

관련 자료

  • 이전 python - Java 코드에서 py 스크립트를 실행하는 방법은 무엇입니까?
  • 다음 linux - 자기 디스크의 ext4 - 검색 최적화 방식으로 임의의 파일 목록을 처리 할 수 ​​있습니까?