我是ASP的新手,我正在创建一个将个人信息存储在数据库中的简单ASP.NET MVC应用程序。使用DB First方法,我创建了以下数据库表:
CREATE TABLE [dbo].[Author] (
[PersonID] INT IDENTITY (1, 1) NOT NULL,
[MobileNum] NVARCHAR (50) NULL,
[Location] NVARCHAR (50) NULL,
[LinkedIn] NVARCHAR (50) NULL,
[FaceBook] NVARCHAR (50) NULL,
[Picture] IMAGE NULL,
[Name] NVARCHAR (50) NULL,
[Email] NVARCHAR (50) NULL,
PRIMARY KEY CLUSTERED ([PersonID] ASC)
);
我使用 PersonID 作为PrimaryKey
,我希望EF为我自动生成此内容,但出于某种原因,这不会发生。
我在属性中手动调整了身份选项:
并且我还将必要的属性附加到我的模型中(虽然我在某处读过自动生成应该在没有它们的情况下工作):
public partial class Author
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PersonID { get; set; }
public string MobileNum { get; set; }
public string Location { get; set; }
public string LinkedIn { get; set; }
public string FaceBook { get; set; }
public byte[] Picture { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
然而,在创建新条目期间,db的ModelState
始终为false:
并在调试器中仔细查看它,问题似乎是EF期望 PersonID 由用户分配。
我有以下View
属于创建操作:
<div class="form-group">
@Html.HiddenFor(model => model.PersonID, htmlAttributes: new { @class = "control-label col-md-2" })
</div>
我是否应该采取其他措施来启用PersonID的自动生成?我错过了什么?将我指向初学者级别,DB First文章也非常感谢,因为我发现的大多数文章都没有提及这个问题(例如,here,here或here )。
答案 0 :(得分:1)
感谢您在评论部分提出的所有建议,但令人惊讶的是,问题与数据库或模型无关:我重新创建了整个数据库,但仍然遇到了同样的错误。 事实证明,问题出现在负责在创建新条目时提示用户输入的视图中,更具体地说,这是有问题的部分:
public class SimpleFrag extends Fragment {
TextView toolbar_title;
RelativeLayout toolbar;
private ProgressBar progressBar;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_simple, container, false);
ButterKnife.bind(this, view);
toolbar_title = getActivity().findViewById(R.id.toolbar_title);
toolbar = getActivity().findViewById(R.id.toolbar);
progressBar = view.findViewById(R.id.progress);
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@SuppressLint("ObjectAnimatorBinding")
@Override
public void run() {
ProgressBarAnimation mProgressAnimation = new ProgressBarAnimation(progressBar, 79, 0);
mProgressAnimation.setDuration(10000);
progressBar.startAnimation(mProgressAnimation);
}
}, 50);
}
}
public class ProgressBarAnimation extends Animation {
private ProgressBar progressBar;
private float from;
private float to;
public ProgressBarAnimation(ProgressBar progressBar, float from, float to) {
super();
this.progressBar = progressBar;
this.from = from;
this.to = to;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
float value = from + (to - from) * interpolatedTime;
progressBar.setProgress((int) value);
}
}
}
解决方案:我只是使用<div class="form-group">
@Html.HiddenFor(model => model.PersonID, htmlAttributes: new { @class = "control-label col-md-2" })
</div>
html帮助程序删除了整个<div>
的id ,db现在接受新条目。就这么简单。
我认为导致问题的是db似乎期望ID由用户提供,即使帮助器被设置为隐藏,我想,这就是为什么@Html.HiddenFor
总是ModelState.IsValid
。我在编辑功能中使用false
(我在创建之前编写了编辑以使用模拟数据测试数据库)并且没有任何问题,所以我认为通过禁止用户与一段数据进行交互,ASP会自动知道不要指望用户,但很明显,我错了。
答案 1 :(得分:0)
尝试使用此代码声明主键
[PersonID] int IDENTITY(1,1) PRIMARY KEY