96

エンティティ フレームワークによって生成された次のクラスがあります。

public partial class ItemRequest
{
    public int RequestId { get; set; }
    //...

これを必須フィールドにしたい

[Required]
public int RequestId { get;set; }

ただし、これは生成されたコードであるため、これは消去されます。プロパティは生成された部分クラスによって定義されるため、部分クラスを作成する方法が想像できません。安全な方法で制約を定義するにはどうすればよいですか?

4

6 に答える 6

41

MUG4Nが答えたように、部分クラスを使用できますが代わりにインターフェースを使用する方がよいでしょう。この場合、EF モデルが検証モデルに対応していないと、コンパイル エラーが発生します。そのため、検証ルールが時代遅れになることを心配することなく、EF モデルを変更できます。

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace YourApplication.Models
{
    public interface IEntityMetadata
    {
        [Required]
        Int32 Id { get; set; }
    }

    [MetadataType(typeof(IEntityMetadata))]
    public partial class Entity : IEntityMetadata
    {
        /* Id property has already existed in the mapped class */
    }
}

PS ASP.NET MVC とは異なるプロジェクト タイプを使用している場合 (手動でデータ検証を実行する場合)、バリデーターを登録することを忘れないでください。

/* Global.asax or similar */

TypeDescriptor.AddProviderTransparent(
    new AssociatedMetadataTypeTypeDescriptionProvider(typeof(Entity), typeof(IEntityMetadata)), typeof(Entity));
于 2014-08-15T11:53:39.070 に答える
14

MUG4Nの回答のような解決策を見つけましたが、代わりにMetaDataクラスをエンティティ クラス内にネストすることで、パブリック名前空間リスト内のクラスの数を減らし、各メタデータ クラスに一意の名前を付ける必要がなくなりました。

using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models 
{
    [MetadataType(typeof(MetaData))]
    public partial class ItemRequest
    {
        public class MetaData
        {
            [Required]
            public int RequestId;

            //...
        }
    }
}
于 2016-11-17T23:29:49.417 に答える
2

あなたが求めていることをどのように行うかはわかりませんが、それを回避する方法があります。カスタム DataAnnotationsModelValidatorProvider の GetValidators をオーバーライドすることによる動的データ検証。その中で、各フィールドを検証するためのルールを (データベース、構成ファイルなどから) 読み取り、必要に応じてバリデーターを追加できます。検証がモデルに密結合されなくなり、サイトを再起動しなくても変更できるという付加価値があります。もちろん、あなたの場合はやり過ぎかもしれませんが、私たちの場合は理想的でした!

于 2013-05-24T13:53:26.123 に答える
1

必要な注釈を追加して T4 テンプレートを変更します。このファイルは通常、MODELNAME.tt という名前です。

T4 がクラスとメソッドを作成している場所を見つけて、これらを配置する場所を確認します。

     <#=codeStringGenerator.IgnoreJson(navigationProperty)#>


//create this method in file
public string IgnoreJson(NavigationProperty navigationProperty){
            string result = navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? "" : @"[JsonIgnore]
    [IgnoreDataMember]";

            return result;
        }

名前空間も追加する必要があります。

<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
using System.ComponentModel.DataAnnotations;
using Newtonsoft.Json;
using System.Runtime.Serialization;

モデルを保存してクラスを再構築します。すべてのメソッドに注釈を付ける必要があります。

于 2016-10-28T19:01:49.730 に答える