C# EntityFramework 5.0中的基类/实体
我在数据库优先方法中使用EntityFramework5,我使用的是edmx文件 我的大多数实体都有6个公共字段。像C# EntityFramework 5.0中的基类/实体,c#,asp.net-mvc,asp.net-mvc-4,entity-framework-5,ef-database-first,C#,Asp.net Mvc,Asp.net Mvc 4,Entity Framework 5,Ef Database First,我在数据库优先方法中使用EntityFramework5,我使用的是edmx文件 我的大多数实体都有6个公共字段。像CreatedAt,CreatedBy等字段。现在,我实现了一些函数作为扩展,只能应用于那些具有公共字段的实体的IQueryable。但是当我实现扩展方法时,它可以被任何类型的IQueryable访问,因为它是类型T,我只能定义类型T应该始终是一种类型 所以,我想我可以给具有公共字段的实体一个基类,并将类型T定义为该基类。但是,看来我不能这么做 关于如何解决这个问题或实现我上面解释
CreatedAt
,CreatedBy
等字段。现在,我实现了一些函数作为扩展,只能应用于那些具有公共字段的实体的IQueryable
。但是当我实现扩展方法时,它可以被任何类型的IQueryable
访问,因为它是类型T,我只能定义类型T应该始终是一种类型
所以,我想我可以给具有公共字段的实体一个基类,并将类型T定义为该基类。但是,看来我不能这么做
关于如何解决这个问题或实现我上面解释的内容,你有什么想法吗?不要创建基类。创建一个界面,如下所示:
public interface IMyEntity
{
DateTime CreatedAt { get; set; }
string CreatedBy { get; set; }
// Other properties shared by your entities...
}
然后,您的模型将如下所示:
[MetadataType(typeof(MyModelMetadata))]
public partial class MyModel : IMyEntity
{
[Bind()]
public class MyModelMetadata
{
[Required]
public object MyProperty { get; set; }
[Required]
public string CreatedBy { get; set; }
}
}
[MetadataType(typeof(IMyEntityValidation))]
public partial class MyModel : IMyEntity
{
public object CreatedOn { get; set; }
public string Username { get; set; }
}
我喜欢:
public interface IShared
{
DateTime CreatedOn { get; set; }
}
public interface ISharedValidation
{
[Required]
DateTime CreatedOn { get; set; }
}
public interface IMyEntity: IShared
{
// Entity Specifics
string Username { get; set; }
}
public interface IMyEntityValidation: ISharedValidation
{
[Required]
string Username { get; set; }
}
然后,您的模型将如下所示:
[MetadataType(typeof(MyModelMetadata))]
public partial class MyModel : IMyEntity
{
[Bind()]
public class MyModelMetadata
{
[Required]
public object MyProperty { get; set; }
[Required]
public string CreatedBy { get; set; }
}
}
[MetadataType(typeof(IMyEntityValidation))]
public partial class MyModel : IMyEntity
{
public object CreatedOn { get; set; }
public string Username { get; set; }
}
如果T4由实体框架生成,则非自动生成的类如下所示:
[MetadataType(typeof(IMyEntityValidation))]
public partial class MyModel : IMyEntity
{
}
通常,感谢您的快速响应。因此,如果我在edmx文件之外定义接口。那么我将在哪里告诉实体从该接口实现。手动编辑所有必需的实体并不容易,因为当我更新edmx文件时,我将不得不再次进行编辑。您不必触摸自动生成的代码。这就是分部类的用途。为EF中的每个实体创建一个分部类(在Models文件夹下)。在这里,您可以为模型定义元数据类型(用于数据注释)。请参阅更新的答案。是的,我目前正在使用MetadataType。但是,尽管有一种简单的方法可以做到这一点,比如给一个实体一个基类,但是如果允许它在图中也提供一个接口,那就更好了。无论如何,我必须为所有实体定义分部类。感谢您的快速帮助如果您需要绑定到IMyEntity中的属性或使它们成为[必需的]?你会在你的分部类中重写这个属性吗?当然可以。但是,如果多个对象将共享同一个接口,我不建议将类嵌套在其中一个对象中。