EF Core/EF6中DbSet能否使用接口?EF4曾不支持
关于EF6和EF Core中DbSet与接口配合使用的支持情况
好问题!不管是EF6还是EF Core,都不支持直接将接口作为DbSet的泛型参数——就像你示例里写的DbSet<ILfSp3Project>这种用法,在这两个版本里都会出问题。核心原因是EF需要具体的实体类型来映射数据库表:接口本身没有具体的属性实现,也无法被EF识别为可映射的实体,它没办法基于接口生成对应的存储模型和SQL语句。
EF6的具体表现
在EF6中,如果你尝试声明DbSet<ILfSp3Project>,编译阶段可能不会报错,但运行时会抛出异常,提示EF无法找到该接口对应的实体配置或映射信息。
EF Core的具体表现
EF Core在编译阶段就会直接阻止这种用法,编译器会明确提示你“类型参数必须是引用类型,且能被EF视为实体”——接口显然不符合这个要求。
可行的替代方案
不过你可以通过实体类实现接口+接口显式实现的方式,既满足业务层的抽象需求,又符合EF的规则。举个修正后的示例:
// 你的业务接口定义 public interface ILfSp3Project { int Id { get; set; } string ProjectName { get; set; } // 其他业务属性 } // 具体的实体类,实现接口 public class LfSp3Project : ILfSp3Project { public int Id { get; set; } public string ProjectName { get; set; } // 其他属性的具体实现,还可以添加EF映射需要的特性(比如[Key]) } // DbContext实现业务接口,用具体实体声明DbSet public class LfSp3Ctx : DbContext, ILfSp3Ctx { // EF需要的具体实体DbSet public DbSet<LfSp3Project> ProjectSE { get; set; } // 显式实现ILfSp3Ctx接口,将具体DbSet转为接口类型 DbSet<ILfSp3Project> ILfSp3Ctx.ProjectSE => ProjectSE.Cast<ILfSp3Project>(); }
这样一来,业务层可以通过ILfSp3Ctx接口来操作ProjectSE,而EF底层依然使用具体的实体类来处理数据库映射,完美兼顾抽象和EF的要求。
内容的提问来源于stack exchange,提问作者Abhijeet
相关产品推荐
相关产品推荐

