문제

제가 말할 여유가 없는 몇 가지 이유 때문에 우리는 Sql Server 2005 데이터베이스에 대한 뷰를 다음과 같이 정의하고 있습니다.

CREATE VIEW [dbo].[MeterProvingStatisticsPoint]
AS
SELECT
    CAST(0 AS BIGINT) AS 'RowNumber',
    CAST(0 AS BIGINT) AS 'ProverTicketId',
    CAST(0 AS INT) AS 'ReportNumber',
    GETDATE() AS 'CompletedDateTime',
    CAST(1.1 AS float) AS 'MeterFactor',
    CAST(1.1 AS float) AS 'Density',
    CAST(1.1 AS float) AS 'FlowRate',
    CAST(1.1 AS float) AS 'Average',
    CAST(1.1 AS float) AS 'StandardDeviation',
    CAST(1.1 AS float) AS 'MeanPlus2XStandardDeviation',
    CAST(1.1 AS float) AS 'MeanMinus2XStandardDeviation'
WHERE 0 = 1

아이디어는 Entity Framework가 이 쿼리를 기반으로 엔터티를 생성하지만 다음과 같은 오류와 함께 엔터티를 생성한다는 것입니다.

경고 6002:테이블/뷰 'Keystone_Local.dbo.MeterProvingStatisticsPoint'에 기본 키가 정의되어 있지 않습니다.키가 유추되었으며 정의가 읽기 전용 테이블/뷰로 생성되었습니다.

그리고 CompletedDateTime 필드가 이 엔터티 기본 키가 되도록 결정합니다.

모델을 생성하기 위해 EdmGen을 사용하고 있습니다.엔터티 프레임워크에 이 뷰의 필드가 기본 키로 포함되지 않도록 하는 방법이 있나요?

도움이 되었습니까?

해결책

우리는 같은 문제가 있었고 이것이 해결책입니다.

엔티티 프레임 워크가 열을 기본 키로 사용하도록 강제하려면 iSnull을 사용하십시오.

열을 기본 키로 사용하지 않도록 엔티티 프레임 워크를 강제하려면 Nullif를 사용하십시오.

이를 적용하는 쉬운 방법은 다른 선택에 귀하의 견해를 선택한 명세서를 래핑하는 것입니다.

예시:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

다른 팁

디자이너를 사용하여 이것을 해결할 수있었습니다.

  1. 모델 브라우저를 엽니 다.
  2. 다이어그램에서보기를 찾으십시오.
  3. 기본 키를 마우스 오른쪽 버튼으로 클릭하고 "엔티티 키"가 확인되었는지 확인하십시오.
  4. 다중 선택 모든 비 예산 키. Ctrl 또는 Shift 키를 사용하십시오.
  5. 속성 창에서 (필요한 경우 F4를 누르십시오) "Entity Key"드롭 다운을 False로 변경하십시오.
  6. 변경 사항을 저장하다.
  7. Visual Studio를 닫고 다시 열립니다. 나는 EF 6과 함께 Visual Studio 2013을 사용하고 있으며 경고를 없애기 위해이 작업을 수행해야했습니다.

IsNull, Nullif 또는 Coalesce 해결 방법을 사용하기 위해 내 견해를 변경할 필요가 없었습니다. 데이터베이스에서 모델을 업데이트하면 경고가 다시 나타나지 만 Vs를 닫고 다시 열면 사라집니다. 디자이너의 변경 사항은 보존되며 새로 고침의 영향을받지 않습니다.

@Tillito에 동의하지만 대부분의 경우 SQL Optimizer를 파울로 만들며 올바른 색인을 사용하지 않습니다.

누군가에게는 분명할지 모르지만 Tillito 솔루션을 사용하여 성능 문제를 해결하는 데 시간을 불 태웠습니다. 테이블이 있다고 가정 해 봅시다 :

 Create table OrderDetail
    (  
       Id int primary key,
       CustomerId int references Customer(Id),
       Amount decimal default(0)
    );
 Create index ix_customer on OrderDetail(CustomerId);

그리고 당신의 견해는 다음과 같습니다

 Create view CustomerView
    As
      Select 
          IsNull(CustomerId, -1) as CustomerId, -- forcing EF to use it as key
          Sum(Amount) as Amount
      From OrderDetail
      Group by CustomerId

SQL Optimizer는 INDEX IX_CUSTOMER를 사용하지 않으며 1 차 인덱스에서 테이블 스캔을 수행하지만 다음 대신 :

Group by CustomerId

너는 사용한다

Group by IsNull(CustomerId, -1)

MS SQL (최소 2008 년)에 올바른 인덱스가 계획에 포함됩니다.

만약에

이 방법은 나에게 잘 작동합니다. 기본 키 필드에 ISNULL ()을 사용하고 필드가 기본 키가되어서는 안되는 경우 NULLAL 값이 없어야하는 경우 Coalesce (). 이 예제는 ID 필드를 불가능한 기본 키로 생성합니다. 다른 필드는 열쇠가 아니며 (없음) 널리 이용할 수있는 속성입니다.

SELECT      
ISNULL(P.ID, - 1) AS ID,  
COALESCE (P.PurchaseAgent, U.[User Nickname]) AS PurchaseAgent,  
COALESCE (P.PurchaseAuthority, 0) AS PurchaseAuthority,  
COALESCE (P.AgencyCode, '') AS AgencyCode,  
COALESCE (P.UserID, U.ID) AS UserID,  
COALESCE (P.AssignPOs, 'false') AS AssignPOs,  
COALESCE (P.AuthString, '') AS AuthString,  
COALESCE (P.AssignVendors, 'false') AS AssignVendors 
FROM Users AS U  
INNER JOIN Users AS AU ON U.Login = AU.UserName  
LEFT OUTER JOIN PurchaseAgents AS P ON U.ID = P.UserID

실제로 기본 키가없는 경우 Row_Number를 사용하여 코드로 무시되는 의사 키를 생성하여 스푸핑 할 수 있습니다. 예를 들어:

SELECT
ROW_NUMBER() OVER(ORDER BY A,B) AS Id,
A, B
FROM SOMETABLE

현재 엔터티 프레임 워크 EDM Generator는 귀하의 관점에서 널리 볼 수없는 모든 필드에서 복합 키를 생성합니다. 이를 제어하려면 기본 키의 일부가되기를 원할 때 열을 수정하고 기본 테이블 열을 수정해야합니다. EDM 생성 키가 데이터-복제 문제를 일으키는 EDM의 복합 키가 해당 열을 포함하도록 강제 할 수없는 것으로 정의해야했습니다.

견해를 얻으려면 나는 단지 보여 주어야했다 하나 기본 키 열 I 첫 번째 뷰를 만들었고 첫 번째 뷰를 만들었고 Nullif를 사용하여 유형을 무효화 할 수있게했습니다. 이것은 EF가보기에 단 하나의 기본 키가 있다고 생각하게하는 데 도움이되었습니다.

EF가 기본 키가없는 엔티티를 수락 할 것이라고 믿지 않기 때문에 이것이 도움이 될지 확실하지 않습니다.

또한 Row_Number를 선택에 통합하고 기본 키로 설정하고 모델에서 다른 모든 열/멤버를 비공개로 설정하기 위해 기본 키가 필요한 것을 엉망으로 만들고 싶지 않은 경우 권장합니다.

위에서 언급한 문제 때문에 저는 테이블 값 함수를 선호합니다.

이것이 있는 경우:

CREATE VIEW [dbo].[MyView] AS SELECT A, B FROM dbo.Something

이것을 만듭니다:

CREATE FUNCTION MyFunction() RETURNS TABLE AS RETURN (SELECT * FROM [dbo].[MyView])

그런 다음 뷰 대신 함수를 가져오기만 하면 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top