如何使用EF获取新行中所有必填字段的名称?

时间:2014-09-12 12:26:21

标签: c# entity-framework

我正在使用EF(db first)并尝试使用下一个代码在表中添加新行:

var user = new User();

//Some logic to fill the properties

context.Users.AddObject(user);
context.SaveChanges();

在保存对EF的更改之前,我想验证是否已填充所有必需(非空且没有默认值)属性。我怎样才能得到所有这些领域?

我尝试过几种方法,但无法达到所需的效果。最后一次尝试是这样的:

var resList = new List<PropertyInfo>();

var properties = type.GetProperties(BindingFlags.DeclaredOnly |
                               BindingFlags.Public |
                               BindingFlags.Instance).Where(p => !p.PropertyType.IsGenericType);

foreach (var propertyInfo in properties)
{
    var edmScalarProperty =
        propertyInfo.CustomAttributes.FirstOrDefault(
            x => x.AttributeType == typeof (EdmScalarPropertyAttribute));
    var isNullable = true;
    if (edmScalarProperty != null)
    {
        var arg = edmScalarProperty.NamedArguments.FirstOrDefault(x => x.MemberName == "IsNullable");
        if (arg != null)
        {
            isNullable = (bool) arg.TypedValue.Value;
        }
    }

    if (!isNullable)
    {
        resList.Add(propertyInfo);
    }
}

return resList;

2 个答案:

答案 0 :(得分:2)

创建一个构造函数,其中包含必填字段作为参数。

我总是将我的域对象与我的EF对象(DTO对象)分开。域对象只有一个带有必填字段的构造函数。当我想保存这些对象时,我将它们转换为DTO对象。

答案 1 :(得分:2)

您是否已查看过模型类的DataAnnotations?利用这些(并使用一个EF为您创建的单独对象),您可以从模型级别获得内置于模型中的非常重要的验证。另外,正如L01NL指出的那样,你可以让你的构造函数接受需要数据的参数。

可以找到关于模型和验证的大量信息,其中一个例子是: http://msdn.microsoft.com/en-us/library/dd410405(v=vs.100).aspx

(查看本主要章节及其小节)

using System.ComponentModel.DataAnnotations

public class Foo
{
    public Guid Id { get; private set; }

    [StringLength(50),Required]
    public string FooName { get; private set; }

    [Required]
    public int Age { get; private set; }

    // etc props

    public Foo(string fooName, int age)
    {
        if (string.IsNullOrEmpty(fooName))
            throw new ArgumentException("FooName cannot be null or empty"); // note there is also a "minimum length" data annotation to avoid doing something like this, was just using this as an example.

        this.Id = Guid.NewGuid();
        this.FooName = fooName;
        this.Age = age;
    }
}

public class YourController
{

    [HttpPost]
    public ActionResult Add(Foo foo)
    {
        if (!ModelState.IsValid)
            // return - validation warnings, etc

        // Add information to persistence
        // return successful add?
    }

}