重複登録防止（ユニークとバリデーション）

EntityにAtrributeを追加してscaffoldするだけだと、このように重複登録ができてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ee3bf0d6-a0d6-5d1e-8d75-60347bba96aa.png)

EntityにUniqueを付けます。
Entityを右クリックし、Edit Entityを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/abe47b50-9eee-f3e1-87b5-567733804fae.png)

New indexをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/2d6e9daf-b90f-f634-4bd4-1dda1c38347a.png)

UniqueをYesにし、Attributesに重複させたくない項目（今回はName）を入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/8c6822da-105a-1383-8ef9-808a3a59f023.png)

Entityを変更したので、Publishしますが、
Entiry上で既に重複があるとエラーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/4852235a-467c-739c-78ba-77ef2e052c00.png)

Publish済みのアプリケーションかEntityを右クリックのView or Edit Dataから重複がないようにデータを変更して、Publishを成功させましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/1707080b-012f-4ffd-2df5-a690b092233d.png)

重複した内容で登録しようとするとエラーが出るようになりましたが、
これだとエンドユーザーにとって不親切なのでValidationを行っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/c2fd41bd-aa30-349c-e3fa-2ea3019dc04a.png)

CustomerDetailのClient Action、Save Detailを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/3ca5047d-ccae-12e6-6c33-4cb985f2164e.png)

CustomerDetail(Screen)を右クリックし、Fetch Data from Databaseを選択、名前をGetCustomerByNameにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/64d845fd-b7ef-11fa-909f-6135b8c1b672.png)

What data do you want to get? に get customer by Name と入力していくと表示されるそれらしきEntityを選択し、Get Dataをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/ca8c5dfb-5494-3773-3689-ea8768380706.png)

No Filtersになっているタブを選択し、Add filerボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/d5499712-5bb7-5bbb-ff90-9b6b548b86c1.png)

Screen上に表示されているName（GetCustomerById.List.Current.Customer.Name）と同じものという条件を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/d2f769e2-d98f-c0d4-54c0-7dea6e77189d.png)

SaveDetailのStartの下にGetCustomerByNameを配置、その下にIfを配置し、ConditionをGetCustomersByName.List.Emptyにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/b4d06d3b-9c8d-50da-2928-416df24083b9.png)

Validationエラー時のAssignを配置しますが、配置したIfの矢印の向きに注意してください。
EmptyがTrueの時は重複していないので下、Falseの時は重複しているのでAssignに向かいます。
そして、そのAssignからはTrueと同じ方向に向かうようにしてください。
そうすると複数項目あった場合、複数のエラー表示を行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/40236b51-b68e-4493-9b13-99e694ae99d8.png)

AssignmentsはInput_Name.ValidとInput_Name.ValidationMessageですが、
Widgetsの配下にあり、配下のValidを一つでもFalseにするとForm1.ValidもFalseになるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/fd158126-7b1e-4f37-ec3a-c018f83551f0.png)

Form1.ValidがFalseの時は、CreateOrUpdateに向かわないようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/2e6d33a2-f11b-13ed-3cc8-123007f5b6c4.png)

テストしてみましょう。
重複した名前でSaveボタンを押すと、エラーが表示されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254659/b9e3b9eb-6fa0-1243-5e9c-f1afd5bcdbcc.png)