Одним из способов применения этого ограничения является использование новой функции проверки, представленной как часть нового API DbContext в EF 4.1.Вы можете написать собственное правило проверки, чтобы убедиться, что типы тегов для веб-сайта любой компании выбраны из допустимых типов тегов для этой компании.Ниже показано, как это можно сделать:
public abstract class ConfigObject
{
public Guid Id { get; set; }
}
public class OperatingCompany : ConfigObject, IValidatableObject
{
public string Name { get; set; }
public virtual ICollection<WebSite> WebSites { get; set; }
public virtual List<TagType> TagTypes { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var allTagTypes = (from w in WebSites from t in w.Tags select t.TagType);
if (!allTagTypes.All(wtt => TagTypes.Exists(tt => tt.Id == wtt.Id)))
{
yield return new ValidationResult("One or more of the website's tag types don't belong to this company");
}
}
}
public class WebSite : ConfigObject
{
public string Url { get; set; }
public Guid OperatingCompanyId { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
public OperatingCompany OperatingCompany { get; set; }
}
public class Tag : ConfigObject
{
public string Name { get; set; }
public Guid TagTypeId { get; set; }
public Guid WebSiteId { get; set; }
public TagType TagType { get; set; }
public WebSite WebSite { get; set; }
}
public class TagType : ConfigObject
{
public string Name { get; set; }
public Guid OperatingCompanyId { get; set; }
public OperatingCompany OperatingCompany { get; set; }
}
public class Context : DbContext
{
public DbSet<OperatingCompany> OperatingCompanies { get; set; }
public DbSet<WebSite> WebSites { get; set; }
public DbSet<Tag> Tags { get; set; }
public DbSet<TagType> TagTypes { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Tag>().HasRequired(t => t.WebSite)
.WithMany(w => w.Tags)
.HasForeignKey(t => t.WebSiteId)
.WillCascadeOnDelete(false);
}
}
В результате EF будет вызывать этот метод проверки каждый раз, когда вы вызываете DbContext.SaveChanges (), чтобы сохранить объект OperatingCompany в базе данных, а EF выбросит (ипрервать транзакцию), если метод возвращает ошибку проверки.Вы также можете заранее проверить наличие ошибок проверки, вызвав метод GetValidationErrors класса DbContext, чтобы получить список ошибок проверки в объектах модели, с которыми вы работаете.
Стоит также отметить, что, поскольку вы используете модель своего домена в качестве модели представления для своего уровня MVC, MVC распознает и соблюдает это правило проверки, и вы можете проверить результат проверки, изучив ModelState в контроллере.Так что это действительно проверяется в двух местах: один раз на вашем уровне представления MVC и один раз на заднем конце EF.
Надеюсь, это поможет.