我正在使用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;
答案 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?
}
}