私は、アプリケーションを未加工のADO.NETと埋め込みSQLからEntityに変換するプロジェクトを開始しました。アプリケーションで使用されているビューの1つで問題が発生しました。ビューには主キーがなく、行を一意に識別する列(または列の組み合わせ)はありません。エンティティを持つ主キーのないビューを使用
SELECT
filingmonth,
CEIL(filingmonth/3),
licnum,
filingyear,
DECODE(GROUPING(insurername), '1', '- All Insured -', insurername),
insurername,
policylinecode,
linedescription,
SUM(NVL(grosspremium, 0)),
SUM(DECODE(taxexempt, 1, grosspremium, 0)),
TRUNC(
CASE
WHEN
(
b.rsn IS NOT NULL
OR A.zeroreport = 1
)
AND b.datereceived IS NULL
THEN A.datereceived
ELSE b.datereceived
END),
SUM(aip.iscompanyadmitted(b.naiccocode, b.naicalienid)),
A.insuredid
FROM
aip.slbtransinsured A
LEFT OUTER JOIN aip.slbtransinsurer b
ON
A.insuredid = b.insuredid
LEFT OUTER JOIN aip.slblinecodes C
ON
b.policylinecode = C.linecode
WHERE
A.submitted = 1
AND A.entryincomplete = 0
GROUP BY
licnum,
filingmonth,
filingyear,
TRUNC(
CASE
WHEN
(
b.rsn IS NOT NULL
OR A.zeroreport = 1
)
AND b.datereceived IS NULL
THEN A.datereceived
ELSE b.datereceived
END),
ROLLUP(insurername, aip.iscompanyadmitted(b.naiccocode, b.naicalienid),
policylinecode, linedescription), A.insuredid;
そして、ここで完全に重複している一部の行(行3および4)が存在することを示すいくつかのサンプルデータです:
FILINGMONTH CEIL(FILINGMONTH/3) LICNUM FILINGYEAR DECODE(GROUPING(INSURERNAME),'1','-ALLINSURED-',INSURERNAME) INSURERNAME POLICYLINECODE LINEDESCRIPTION SUM(NVL(GROSSPREMIUM,0)) SUM(DECODE(TAXEXEMPT,1,GROSSPREMIUM,0)) TRUNC(CASEWHEN(B.RSNISNOTNULLORA.ZEROREPORT=1)ANDB.DATERECEIVEDISNULLTHENA.DATERECEIVEDELSEB.DATERECEIVEDEND) SUM(AIP.ISCOMPANYADMITTED(B.NAICCOCODE,B.NAICALIENID)) INSUREDID
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 17 OTHER LIABILITY 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 17 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 721.25 0 18-JUL-07 0 81
6 2 8150 2007 SAVERS PROPERTY AND CASUALTY INSURANCE CO SAVERS PROPERTY AND CASUALTY INSURANCE CO 721.25 0 18-JUL-07 0 81
insuredidがあるが、ここでビューを使用して作成された選択でありますpk aip.slbtransinsuredテーブルの場合、rsnはaip.slbtransinsurerとaip.slblinecodesのpkです。
Entityモデルに一意の識別子を付けずにビューを追加することは可能ですか?または、ビューに一意の行識別子を追加する簡単な方法はありますか?ビューは読み込まれず、書き込まれません。
ありがとうございます - あなたは本当に私を助けました。私は見た目の一意のID列を持たず、LINQが同じ行を返すために絶望し始めていたOracleテーブルで作業しています。私はEntityクラスで独自のキーを作成することについての提案に従っており、完全に機能します。 – markp3rry
私は投影にGUIDを追加する方が効率的だと思います。バイナリデータフィールドのビューでは、私はover(order by)クエリが遅いことがわかりました。このアプローチに問題はありますか?たとえば、SELECT NEWID()AS PrimaryKey、 FROMビュー –
データベース初回のEntity Frameworkを使用する場合は、「読み取り専用エンティティ」として追加されたビューを主キーに設定する方法があります。ビューを追加すると、[きちんとしたエラー](http://stackoverflow.com/questions/24792259/error-6002-the-table-view-does-not-have-a-primary-key-defined)も表示されますあなたのエンティティがキーなしの読み取り専用エンティティであることを強制する**という明らかなキーはありません。確かにこれを自分で複製する方法がありますか? – ruffin