Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架如何使验证只在实体上进行,而不在基础实体上进行_C#_.net_Entity Framework 4 - Fatal编程技术网

C# 实体框架如何使验证只在实体上进行,而不在基础实体上进行

C# 实体框架如何使验证只在实体上进行,而不在基础实体上进行,c#,.net,entity-framework-4,C#,.net,Entity Framework 4,我的所有实体都继承自。我遇到的问题是,当我保存一个实体时,这个实体包含一个属性,该属性引用另一个未完全加载的实体(它不是null,但只包含内部带有引用键的对象),代码会引发错误。错误在于属性(引用另一个实体)未正确验证。这是正确的,因为对象只包含ID。让我用一个小示例向您展示我正在谈论的内容: public class Exercise : BaseModel { public LocalizedString Name { get; set; } public virtual M

我的所有实体都继承自。我遇到的问题是,当我保存一个实体时,这个实体包含一个属性,该属性引用另一个未完全加载的实体(它不是null,但只包含内部带有引用键的对象),代码会引发错误。错误在于属性(引用另一个实体)未正确验证。这是正确的,因为对象只包含ID。让我用一个小示例向您展示我正在谈论的内容:

public class Exercise : BaseModel
{
    public LocalizedString Name { get; set; }
    public virtual Muscle Muscle { get; set; }

    public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Name == null)
        {
            yield return new ValidationResult("Name is mandatory", new[] { "Name" });
            yield break;
        }

        if (Name.French == null || Name.French.Length < 3)
        {
            yield return new ValidationResult("Exercise's French name must be over 3 characters");
        }

        if (Name.English == null || Name.English.Length < 3)
        {
            yield return new ValidationResult("Exercise's English name must be over 3 characters");
        }

        if (Muscle == null)
        {
            yield return new ValidationResult("Exercice must be assigned to a muscle");
        }
    }
}

public class Muscle : BaseModel
{
    public LocalizedString Name { get; set; }
    public ICollection<Exercise> Exercises { get; set; }
    public override IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Name == null)
        {
            yield return new ValidationResult("Name is mandatory", new[] { "Name" });
            yield break;
        }

        if (Name.French == null || Name.French.Length < 3)
        {
            yield return new ValidationResult("Muscle's French name must be over 3 characters");
        }

        if (Name.English == null || Name.English.Length < 3)
        {
            yield return new ValidationResult("Muscle's English name must be over 3 characters");
        }
    }
}

//--- This is the code into the repository:
public int Insert(Exercise entity)
{
    if (entity.Muscle != null)
    {
        var localExercise = DatabaseContext.Set<Muscle>().Local.SingleOrDefault(e => e.Id == entity.Muscle.Id);
        if (localExercise != null)
        {
            DatabaseContext.Set<Muscle>().Attach(entity.Muscle);
        }
    }

    DatabaseContext.Set<Exercise>().Add(entity);
    return DatabaseContext.SaveChanges();
}
公共课堂练习:BaseModel
{
公共本地化字符串名称{get;set;}
公共虚拟肌肉{get;set;}
公共重写IEnumerable验证(ValidationContext ValidationContext)
{
if(Name==null)
{
返回新的ValidationResult(“名称为必填项”,新[]{“名称”});
屈服断裂;
}
if(Name.French==null | | Name.French.Length<3)
{
返回新的ValidationResult(“练习的法语名称必须超过3个字符”);
}
if(Name.English==null | | Name.English.Length<3)
{
返回新的ValidationResult(“练习的英文名称必须超过3个字符”);
}
if(Muscle==null)
{
返回新的ValidationResult(“必须将练习分配给肌肉”);
}
}
}
公共类肌肉:基本模型
{
公共本地化字符串名称{get;set;}
公共ICollection练习{get;set;}
公共重写IEnumerable验证(ValidationContext ValidationContext)
{
if(Name==null)
{
返回新的ValidationResult(“名称为必填项”,新[]{“名称”});
屈服断裂;
}
if(Name.French==null | | Name.French.Length<3)
{
返回新的ValidationResult(“Muscle的法语名称必须超过3个字符”);
}
if(Name.English==null | | Name.English.Length<3)
{
返回新的ValidationResult(“Muscle的英文名称必须超过3个字符”);
}
}
}
//---这是存储库中的代码:
公共整数插入(行使实体)
{
如果(entity.Muscle!=null)
{
var localExercise=DatabaseContext.Set().Local.SingleOrDefault(e=>e.Id==entity.Muscle.Id);
if(localExercise!=null)
{
DatabaseContext.Set().Attach(entity.Muscle);
}
}
DatabaseContext.Set().Add(实体);
返回DatabaseContext.SaveChanges();
}
我正在保存这个练习。该练习包含名称,肌肉设置了有效ID,但不包含任何名称。这就是为什么当我保存时,验证发生在实体框架内,它告诉我肌肉对象需要名称

我不需要让肌肉完全负荷,因为我只想连接这个。我不想有一个属性“MuscleID”。我真的很想有这样的结构


谁能告诉我需要做什么才能使验证只在保存的实体上进行,而不在外部对象上进行?

您应该在控制器和视图之间使用ViewModel。这样你就可以把你的模型排除在等式之外。然后用于将ViewModel属性映射到控制器中回发时的模型。ViewModel可以定义验证规则并实现IValidatableObject。还可以将所有ViewModel定义为不包含基础实体。这会将多余的实体和属性排除在视图之外。确保在if(ModelState.IsValid)检查后使用AutoMapper将ViewModel映射到您的模型。

我有ViewModel。这不是问题。这个问题与模型的对象有关。保存模型后,EF会自动调用接口进行验证。