EntityFramework 5.0中的基类/实体

8
我正在使用 Entity Framework 5 的 Database First 方法,并且使用 edmx 文件。我的大多数实体都有 6 个共同的字段,例如 CreatedAt、CreatedBy 等。现在,我实现了一些函数作为扩展,只能应用于具有公共字段的实体的 IQueryable。但是,当我实现扩展方法时,它可以被任何类型的 IQueryable 访问,因为它是类型化的 T,而我只能定义类型 T 应始终为一种类型。
所以,我想给实体一个基类,其中包含公共字段,并将类型 T 定义为该基类型。但是,看起来我不能这样做。
您有什么解决方法或实现上述内容的想法吗?
2个回答

9

不要创建一个基类。创建一个接口,如下所示:

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; }  
   }
}

感谢您的快速回复。 那么,如果我在edmx文件之外定义接口。我要在哪里告诉实体从那个接口实现呢?手动编辑所有所需实体并不容易,因为当我更新edmx文件时,我需要再次进行编辑。 - Amila
2
你不需要修改自动生成的代码。这就是 partial classes 的用途。你需要在 Models 文件夹下为每个 EF 实体创建一个 partial class,这样你就可以为你的 Models 定义 MetadataType(用于数据注释)。请参考更新后的答案。 - ataravati
是的,目前我正在使用MetadataType。但是我认为可能有一种简单的方法来做到这一点,例如为实体提供一个基类,如果它允许在图表中同时给出接口的话就更好了。不管怎样,看起来我将不得不为所有实体定义部分类。感谢您快速的帮助。 - Amila
如果您需要绑定到IMyEntity中的属性或将它们设置为[Required],您会覆盖部分类中的属性吗? - TheOptimusPrimus
@TheOptimusPrimus,你不需要做任何事情来绑定到IMyEntity中的属性。它们只是像其他属性一样的属性。而且,要使用数据注释属性,如[Required],你可以像答案中那样使用MetadataType类。 - ataravati
显示剩余3条评论

2
我是一个粉丝:
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(IMyEntityValidation))]
public partial class MyModel : IMyEntity
{
  public object CreatedOn { get; set; }
  public string Username { get; set; }  
}

如果T4由Entity Framework生成,则您的非自动生成类将如下所示:

[MetadataType(typeof(IMyEntityValidation))]
public partial class MyModel : IMyEntity
{
}

通常情况下,在Asp.Net MVC中不建议使用Bind。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接