带有实体框架的ASP.NET:EF不会自动生成身份

时间:2018-02-02 20:33:54

标签: c# asp.net asp.net-mvc entity-framework

我是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为我自动生成此内容,但出于某种原因,这不会发生。 我在属性中手动调整了身份选项:

PersonID marked as identity

并且我还将必要的属性附加到我的模型中(虽然我在某处读过自动生成应该在没有它们的情况下工作):

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:

ModeslState is 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文章也非常感谢,因为我发现的大多数文章都没有提及这个问题(例如,hereherehere )。

2 个答案:

答案 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