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

时间:2014-03-25 17:11:49

标签: 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 Guid? STATE_ID { get; set; }
    public string ZIP { get; set; }
}

此ADDRESS模型在我的整个应用程序中使用,并具有不同的验证要求,具体取决于它在表单中的放置位置。

我想知道是否有办法自定义数据注释。例如,OCCUPATION_ADDRESS需要ADDRESS_LINE和CITY属性,但WORK_LOCATION_ADDRESS不需要。

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”。

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

1 个答案:

答案 0 :(得分:0)

你可以通过使用继承的思想来实现这一点 怎么样?

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; }

}

并且继承应该是每层次结构表(TPH)

有关TPH的详细信息,请查看此Table per hierarchy

希望这会对你有所帮助

问候