1

WCF RIA Services를 처음 사용하며 LightSwitch를 4 개월 이상 사용해 왔습니다. LightSwitch 응용 프로그램 전체에서 조회 테이블을 편집하는 데 사용되는 일반 화면을 만들었습니다. 대부분 동적 인 다른 엔티티 세트와 함께 사용할 수있는 일반 화면을 만드는 방법을 배우기 위해서입니다. WCF RIA 서비스가있는 재사용 가능한 일반 LightSwitch 화면

화면

은 매우 간단하다 : Application.ShowLookupTypesList("StatusTypes", "StatusTypeId"); 데이터베이스의 조회 테이블의 엔티티 집합에 해당합니다

Generic LookupTypesList in LightSwitch

이 유사 인수 열립니다.

가 여기 내 WCF RIA 서비스 코드입니다 : 내가 실행 화면에서 목록에 항목을 추가 할 때

using System.Data.Objects.DataClasses; 
using System.Diagnostics; 
using System.Reflection; 
using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Data; 
using System.Linq; 
using System.ServiceModel.DomainServices.EntityFramework; 
using System.ServiceModel.DomainServices.Server; 

namespace WCF_RIA_Project 
{ 
    public class LookupType 
    { 
     [Key] 
     public int TypeId { get; set; } 
     public string Name { get; set; } 
    } 

    public static class EntityInfo 
    { 
     public static Type Type; 
     public static PropertyInfo Key; 
     public static PropertyInfo Set; 
    } 

    public class WCF_RIA_Service : LinqToEntitiesDomainService<WCSEntities> 
    { 

     public IQueryable<LookupType> GetLookupTypesByEntitySet(string EntitySetName, string KeyName) 
     { 
      EntityInfo.Set = ObjectContext.GetType().GetProperty(EntitySetName); 
      EntityInfo.Type = EntityInfo.Set.PropertyType.GetGenericArguments().First(); 
      EntityInfo.Key = EntityInfo.Type.GetProperty(KeyName); 

      return GetTypes(); 
     } 

     [Query(IsDefault = true)] 
     public IQueryable<LookupType> GetTypes() 
     { 
      var set = (IEnumerable<EntityObject>)EntityInfo.Set.GetValue(ObjectContext, null); 
      var types = from e in set 
         select new LookupType 
         { 
          TypeId = (int)EntityInfo.Key.GetValue(e, null), 
          Name = (string)EntityInfo.Type.GetProperty("Name").GetValue(e, null) 
         }; 
      return types.AsQueryable(); 
     } 

     public void InsertLookupType(LookupType lookupType) 
     { 
      dynamic e = Activator.CreateInstance(EntityInfo.Type); 
      EntityInfo.Key.SetValue(e, lookupType.TypeId, null); 
      e.Name = lookupType.Name; 

      dynamic set = EntityInfo.Set.GetValue(ObjectContext, null); 
      set.AddObject(e); 
     } 

     public void UpdateLookupType(LookupType currentLookupType) 
     { 
      var set = (IEnumerable<EntityObject>)EntityInfo.Set.GetValue(ObjectContext, null); 
      dynamic modified = set.FirstOrDefault(t => (int)EntityInfo.Key.GetValue(t, null) == currentLookupType.TypeId); 
      modified.Name = currentLookupType.Name; 
     } 

     public void DeleteLookupType(LookupType lookupType) 
     { 
      var set = (IEnumerable<EntityObject>)EntityInfo.Set.GetValue(ObjectContext, null); 
      var e = set.FirstOrDefault(t => (int)EntityInfo.Key.GetValue(t, null) == lookupType.TypeId); 
      Debug.Assert(e.EntityState != EntityState.Detached, "Entity was in a detached state."); 
      ObjectContext.ObjectStateManager.ChangeObjectState(e, EntityState.Deleted); 
     } 
    } 
} 

, 나는 데이터를 충돌 를 수신 한 후, 저장을 편집하고 다시 저장 "다른 사용자가 삭제 한 이 기록. "

Data Conflict: "Another user has deleted this record."

나는 쿼리가 저장 후 다시로드하여이를 해결할 수 있습니다,하지만 어색합니다.

동일한 이름의 항목을 제거한 다음 저장하고 읽은 다음 저장하면 데이터를 저장할 수 없습니다. "컨텍스트가 이미 동일한 리소스 Uri를 가진 다른 엔터티를 추적 중입니다." 이러한 문제의

Unable to save data: "The context is already tracking a different entity with the same resource Uri."

모두는 WCF RIA 서비스를 사용하여 내 일반적인 화면에 영향을 미칩니다. 특정 데이터베이스 엔티티에 대한 ListDetail 화면을 작성할 때 문제가 없습니다. 내가 어떤 논리 나 아이디어를 놓친 것 같아?

답변

1

나는이 잘못된 접근 방식 LightSwitch를 사용하는 것을 배웠다 :

는이 프로젝트의 샘플 코드를 참조하십시오.

제네릭 화면이 완전히 에뮬레이션되지 않으며 많은 작업을하지 않으면 수행 할 수없는 몇 가지 숨겨진 기능이 있습니다. 내가받은 오류는 한 가지 예일뿐입니다. LightSwitch의 기본 충돌 해결도에서 실패합니다.

LS의 RAD 디자인은 몇 가지 공유 방법을 사용하여 유사한 화면을 만드는 것입니다. 한 번에 많은 화면에서 실제 레이아웃을 변경해야하는 경우 인 경우 .lsml 파일을 바꿔야하고 일 경우 항상 & 파일을 대체하고 백업을 먼저 만들어야합니다. 이 파일을 직접 수정하는 것은 지원되지 않습니다.

0

최근에 오류가 발생했습니다. 제 경우에는 WCF RIA 서비스에서 고유 한 ID를 만듭니다. 그러나 코드 뒤에있는 내 화면에서 나중에 WCF RIA 서비스 삽입 메서드에 전달 될 개체를 만들 때 고유 ID를 명시 적으로 설정해야합니다 (이 값은 기본 데이터베이스 테이블의 고유 카운터 ID로 겹쳐 쓰임). http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/157/A-Visual-Studio-LightSwitch-Picture-File-Manager.aspx

+0

LookupType_Created에서 실험했지만 기쁨이없는 임의의 ID를 시도했지만 화면 숨김 개체를 만들지 않습니다. 나는 InsertLookupType (RIA)에서 또한 시도했다.이전에이 솔루션을 실제로 읽었지만, 적용 할 경우 제 경우에 적용하는 방법을 잘 모릅니다. : -/응답 해 주셔서 감사합니다! –