问题
Quick question...
If I put a notation in the Interface...
Say [Required]
can I ommit that notation in the C# class for the property?
i.e. can I...
Interface IFoo
{
[Required]
string Bar {get; set;}
}
Class Foo : IFoo
{
string Bar {get; set;}
}
or do I need to just not put the notation in the interface and do this...
Interface IFoo
{
string Bar {get; set;}
}
Class Foo : IFoo
{
[Required]
string Bar {get; set;}
}
回答1:
Placing the Data Annotation in the interface won't work. In the following link there is an explanation as to why: http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/1748587a-f13c-4dd7-9fec-c8d57014632c/
A simple explanation can be found by modifying your code as follows:
interface IFoo
{
[Required]
string Bar { get; set; }
}
interface IBar
{
string Bar { get; set; }
}
class Foo : IFoo, IBar
{
public string Bar { get; set; }
}
Then it is not clear as to whether the Bar string is required or not, since it is valid to implement more than one interface.
回答2:
The Data Annotation won't work but I don't know why.
If you are using EF code first you can use Fluent API to force this behavior when creating your database. This is a workaround, not a real solution because only your database will check the constraint, not EF or any other system working with Data Annotation (well I suppose).
I did it with
public partial class MyDbContext : DbContext
{
// ... code ...
protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
{
dbModelBuilder.Types<IFoo>().Configure(y => y.Property(e => e.Bar).IsRequired());
}
}
Telling the system that when it recognize a class implementing IFoo you configure the property to IsRequired.
来源:https://stackoverflow.com/questions/17006496/c-sharp-data-annotations-in-interface