我正在使用Ado.net实体框架。为什么继承的类不接受基类值?
表格
CREATE TABLE [dbo].[Access1](
[Id] [int] IDENTITY(1,1) NOT NULL,
[F_Name] [varchar](50) NULL,
[L_Name] [varchar](50) NULL,
[Middle_Name] [varchar](50) NULL,
[Gender] [varchar](10) NULL,
PRIMARY KEY CLUSTERED
public abstract class Common
{
public string F_Name { get; set; }
public string L_Name { get; set; }
}
public partial class Access1 : Common
{
public string Middle_Name { get; set; }
public string Gender { get; set; }
}
Home.cs
1)这里"Access1 hh = new Access1();"
不接受来自抽象基类的值。
2)hh.F_Name
显示null
值
public ActionResult AbsAssClass(General ss)
{
Access1 hh = new Access1();
var access = new Access1
{
F_Name=ss.F_Name, L_Name = ss.L_Name
};
db.Access1.Add(access); //An exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll but was not handled in user code
}
答案 0 :(得分:2)
您有两种选择:
创建一个构造函数,接受两个字符串作为参数,并将它们分配给您的属性:
abstract class Common
{
public Common(string fName, string lName)
{
this.F_Name = fName;
this.L_Name = lName;
}
}
为了使其工作,派生类需要一个带有两个参数的(空)构造函数,这些参数只是重定向到基类类:
Access(string fName, string lName) : base(fName, lName) { }
或者通过对象初始化器直接设置params:
var access = new Access { F_Name = anotherValue, L_Name = myValue }
这样做的好处是你甚至不需要修改类的代码,因为你不需要任何构造函数(实际上你只是使用了default-one并在调用后进行了一些赋值)。这和写这个一样:
var access = new Access();
access.F_Name = myValue;
access.L_Name = anotherValue;