2

我决定在我的项目中使用 Entity Framework 进行 O/R 映射,并使用 DataAnnotations 进行验证,现在我在尝试实现它时遇到了一个奇怪的问题。

这就是我所做的:

我有以下实体类型

Contact
*******
Int32 Id (not null, Entity Key)
Name Name (not null) 
Address Address (not null)
String Phone
String Email

其中NameAddress是复杂类型,定义如下:

Name                                  Address
****                                  *******
String First (not null)               String Street (not null)
String Last (not null)                String ZipCode (not null)
                                      String City (not null)

以下类与我的实体位于相同的命名空间中:

public class ContactMetadata
{
    [Required]
    public Name Name { get; set; }
}

[MetadataType(typeof(ContactMetadata))]
partial class Contact { }

但是,当我创建一个新Contact项目时,NameandAddress类型填充了所有值的实例NameAddress位置null,而不是Name它们本身Address具有null值。因此,该Required属性不会引发任何错误,尽管所有值都是null. 我该如何解决这个问题?

4

4 回答 4

1

所以它会创建属性为空的 Name 和 Address 对象的实例?有趣的。

你能把 [Required] 属性放在孩子身上吗?

编辑:我知道这可能被认为是一种很臭的方式,但为了清楚起见,我将您的答案编辑到帖子中,以便下一个人遇到此问题时更容易找到它......

建议(并接受但未经测试)的解决方案:

null编写一个针对值进行验证的自定义验证属性。

于 2009-06-30T03:26:10.267 回答
1

确保以 HTML 字段结尾的名称与类的属性名称对齐。

例如,如果你有这个:

public class Contact {
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
}

public class Address {
    public string Street { get; set; }
    public string City { get; set; }
    [...]
}

您对 HTML 帮助程序的调用应如下所示:

<%= Html.TextBox("FirstName") %>
<%= Html.TextBox("LastName") %>
<%= Html.TextBox("Address.Street") %>
<%= Html.TextBox("Address.City") %>
[...]
于 2009-06-30T04:25:59.123 回答
0

查看这篇博文 complex-dataannotations-validation。我认为RequiredAssociation 属性是您所需要的。您可能需要针对 Entity Framework 而不是 LINQ to SQL 对其进行一些调整。

于 2009-07-30T16:33:24.170 回答
0

我现在正在努力解决同样的问题。我认为一种半优雅的方法是将关键原始类型引用为属性,并将数据注释放在上面。这是一个以 AddressID 为关键字段的示例。

public class Contact{

[Required]
public int? AddressIDForValidation{
get{return this.Address.AdressID;}
}

public Address Address{get;set;}
}



public class Address{
public int? AddressID{get;set;}
public string Street{get;set;}
}
于 2011-05-28T17:48:46.263 回答