如何修复替换ADO.NET Entity Data Model后出现的CS1729构造函数错误
解决ADO.NET Entity Data Model移除并添加模型后的CS1729错误
错误信息
Error CS1729
'object' does not contain a constructor that takes 2 arguments DataLayer
at :base(..)
问题原因
错误根源是Entities类未正确继承EF的上下文基类(DbContext或ObjectContext)。移除旧模型并添加新模型后,EF自动生成的Entities partial类代码可能被重置,导致你手动编写的这个partial类的基类默认变为object,此时调用base(connectionString, contextOwnsConnection)就会找不到匹配的构造函数。
解决步骤
- 确认自动生成的
Entities类基类
找到EF模型生成的另一个Entitiespartial类文件(通常在.tt模板生成的代码中,比如HOTEL.Context.cs),确保它继承自DbContext(EF6及以上版本)或ObjectContext(早期EF版本)。正确的自动生成代码类似:public partial class Entities : DbContext { // 自动生成的构造函数、DbSet集合等内容 } - 修正构造函数的基类调用
只要Entities类正确继承DbContext,DbContext本身就提供了接受DbConnection和bool参数的构造函数,此时base(connectionString, contextOwnsConnection)调用会正常生效。 - 核对模型元数据路径
代码中entityBuilder.Metadata指定的HOTEL.csdl|ssdl|msl要与新添加的模型文件名一致。如果新模型名称不是HOTEL,需修改为对应名称,例如新模型名为NewHotel,则路径改为:entityBuilder.Metadata = @"res://*/NewHotel.csdl|res://*/NewHotel.ssdl|res://*/NewHotel.msl"; - 清理并重新生成项目
移除旧模型后可能残留编译缓存,右键项目选择清理,再执行重新生成,确保所有代码编译正确。
优化后的代码示例
namespace DataLayer { [Serializable] public partial class Entities { private Entities(DbConnection connection, bool contextOwnsConnection = true) : base(connection, contextOwnsConnection) { } public static Entities CreateEntities(bool contextOwnsConnection = true) { // 使用using自动释放文件流,避免资源泄漏 using (FileStream fs = File.Open("connectdb.dba", FileMode.Open, FileAccess.Read)) { BinaryFormatter bf = new BinaryFormatter(); connect cp = (connect)bf.Deserialize(fs); string servername = Encryptor.Decrypt(cp.servername, "qwertyuiop", true); string database = Encryptor.Decrypt(cp.database, "qwertyuiop", true); EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder(); entityBuilder.Provider = "System.Data.SqlClient"; entityBuilder.ProviderConnectionString = $"Data Source={servername};Initial Catalog={database};Integrated Security=true"; // 确认元数据路径与新模型匹配 entityBuilder.Metadata = @"res://*/HOTEL.csdl|res://*/HOTEL.ssdl|res://*/HOTEL.msl"; EntityConnection connection = new EntityConnection(entityBuilder.ConnectionString); return new Entities(connection, contextOwnsConnection); } } } }
内容的提问来源于stack exchange,提问作者Phuc T.
相关产品推荐
相关产品推荐

