Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityFramework 5.0中的基类/实体_C#_Asp.net Mvc_Asp.net Mvc 4_Entity Framework 5_Ef Database First - Fatal编程技术网

C# EntityFramework 5.0中的基类/实体

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定义为该基类。但是,看来我不能这么做 关于如何解决这个问题或实现我上面解释

我在数据库优先方法中使用EntityFramework5,我使用的是edmx文件

我的大多数实体都有6个公共字段。像
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中的属性或使它们成为[必需的]?你会在你的分部类中重写这个属性吗?当然可以。但是,如果多个对象将共享同一个接口,我不建议将类嵌套在其中一个对象中。