8

我在 Database First 方法中使用 Entity Framework 5,并且我正在使用 edmx 文件。

我的大多数实体都有 6 个公共字段。CreatedAt等字段CreatedBy。现在,我实现了一些功能作为扩展,这些功能只能应用于IQueryable那些具有公共字段的实体。但是当我实现扩展方法时,它可以被任何类型访问,IQueryable因为它的类型是 T,我只能定义类型 T 应该始终是一种类型。

所以,我想我可以为具有公共字段的实体提供一个基类,并将类型 T 定义为该基类型。但是,我似乎无法做到这一点。

关于如何解决这个问题或实施我上面解释的任何想法?

4

2 回答 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; }  
   }
}
于 2013-08-16T14:31:10.320 回答
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 由实体框架生成,那么您的非自动生成的类将如下所示:

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

通常,不建议在 Asp.Net MVC 中使用 Bind

于 2013-08-16T18:11:55.680 回答