Entity framework EF数据注释-外键-如何自定义

Entity framework EF数据注释-外键-如何自定义,entity-framework,model-view-controller,data-annotations,Entity Framework,Model View Controller,Data Annotations,我的问题如下。我有一个地址表的模型,如下所示 public partial class ADDRESS { public ADDRESS() { this.ADDRESS_ID = Guid.NewGuid(); } public Guid ADDRESS_ID { get; set; } public string ADDRESS_LINE { get; set; } public string CITY { get; set;

我的问题如下。我有一个地址表的模型,如下所示

public partial class ADDRESS
{
    public ADDRESS()
    {
        this.ADDRESS_ID = Guid.NewGuid();
    }

    public Guid ADDRESS_ID { get; set; }
    public string ADDRESS_LINE { get; set; }
    public string CITY { get; set; }
    public Guid? STATE_ID { get; set; }
    public string ZIP { get; set; }
}
这个地址模型在我的整个应用程序中都使用,并且根据它在表单中的位置有不同的验证要求

我想知道是否有办法定制数据注释。例如,地址线和城市属性对于职业地址是必需的,但对于工作位置地址不是必需的

public class OCCUPATION_DETAILS
{
    public string COMPANY_NAME { get; set; }
    public string JOB_TITLE { get; set; }
    etc...

    public Guid OCCUPATION_ADDRESS_ID { get; set; }
    public virtual ADDRESS OCCUPATION_ADDRESS { get; set; }

    public WORK_LOCATION_ID { get; set; }
    public virtual ADDRESS WORK_LOCATION_ADDRESS { get; set; }

}
或者,基本验证可能是相同的(zip必须是5位数字),但我需要调整用于匹配表单标签的“DisplayName”


尽量减少我设置的复制模型数量;否则维护将是一场噩梦。

您可以使用继承的思想来实现这一点 怎么做

公共抽象类地址
{
公共广播
{
this.ADDRESS_ID=Guid.NewGuid();
}
公共Guid地址\u ID{get;set;}
公共字符串地址_行{get;set;}
公共字符串CITY{get;set;}
公共Guid?状态_ID{get;set;}
公共字符串ZIP{get;set;}
}
公共对等类职业地址:地址,IValidatableObject
{
公共IEnumerable验证(ValidationContext ValidationContext)
{
if(string.IsNullOrWhiteSpace(地址线))
返回新的ValidationResult(“需要地址行!”,新字符串[]{“地址行”});
}
}
公共平级工作地点地址:地址,IValidatableObject
{
公共IEnumerable验证(ValidationContext ValidationContext)
{
}
}
//您的职业详细信息类将如下所示:您将使用相应的派生类,而不是ADDRESS
公共类职业详细信息
{
公共字符串公司名称{get;set;}
公共字符串作业标题{get;set;}
等
公共Guid占用\u地址\u ID{get;set;}
公共虚拟占用地址占用地址{get;set;}
公共工作位置ID{get;set;}
公共虚拟工作地址工作地址地址{get;set;}
}
继承应该是每个层次结构的表(TPH)

有关TPH的更多信息,请查看此

希望这能对你有所帮助

问候

public abstract class ADDRESS
{
    public ADDRESS()
    {
        this.ADDRESS_ID = Guid.NewGuid();
    }

    public Guid ADDRESS_ID { get; set; }
    public string ADDRESS_LINE { get; set; }
    public string CITY { get; set; }
    public Guid? STATE_ID { get; set; }
    public string ZIP { get; set; }
}

public parital class OCCUPATION_ADDRESS: ADDRESS,IValidatableObject
{
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {
       if(string.IsNullOrWhiteSpace(ADDRESS_LINE))
          yield return new ValidationResult("Address line is required!",new string[]{"ADDRESS_LINE"});
   }
}

public parital class WORK_LOCATION_ADDRESS: ADDRESS,IValidatableObject
{
   public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
   {

   }
}

// and your Occupation details class will be like: instead of ADDRESS you will use the corresponding derived classes
public class OCCUPATION_DETAILS
{
    public string COMPANY_NAME { get; set; }
    public string JOB_TITLE { get; set; }
    etc...

    public Guid OCCUPATION_ADDRESS_ID { get; set; }
    public virtual OCCUPATION_ADDRESS OCCUPATION_ADDRESS { get; set; }

    public WORK_LOCATION_ID { get; set; }
    public virtual WORK_LOCATION_ADDRESS WORK_LOCATION_ADDRESS { get; set; }

}