在具有实体框架的

时间:2015-07-16 14:03:23

标签: c# sql-server entity-framework

就像标题所说,我对实体框架有疑问......

我想在带有标识主键列的表格上将数据插入到我的数据库中...

但是当我创建没有像这样的ID的对象时......

var p= new T_Person() { Name = "Test", Gender='m', Age=19 };

并尝试将其添加到我的数据库中......

DbContext.T_Person.Add(p); DbContext.SaveChanges();

我总是得到一条消息错误,当我想在我的表中添加一个条目时,我需要将IDENTITY INSERT设置为ON,因为PersonID自动具有值0 ...

编辑1: 我使用模型第一方法,人类是自动生成的......

namespace Model 
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations.Schema;

    public partial class T_Person
    {
        public T_Person()
        {
            ...
        }
        public int PersonID { get; set; }
        public string Name{ get; set; }
        public char Gender{ get; set; }
        public int Age{ get; set; }
        ...

如果我像这样添加了带有DatabaseGenerated的Attribute:

        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int PersonID { get; set; }

接下来的问题是如何获取我的Person对象的ID属性的生成值?我知道我可以使用“SELECT IDENT_CURRENT('T_Person')”SQL命令获取当前的Identity值,但是当我尝试查找具有ID值的人时:

var addedPerson = ctx.T_Person.FirstOrDefault(pe => pe.PersonID == id);

id是具有SQL Command ...

值的属性

编辑2:

save方法如下所示:

using (var transaction = DbContext.Database.BeginTransaction())
{
    ObservableCollection<T_PersonContakt> pContacts = new ObservableCollection<T_PersonContakt>();

    try
    {
         var p= new T_Person() { Name = "Test", Gender='m', Age=19 };
         ctx.T_Person.Add(pers);
         ctx.SaveChanges();

         foreach (var contact in PersonContacts)
         {
              pContacts.Add(new T_PersonKontakt()
              {
                   TypeID = contact.TypeID,
                   Priority = contact.Priority,
                   PersonID = id, // HERE I NEED THE ID OF THE INSERTED PERSON
                   Value = contact.Value
               });
          }
          ctx.SaveChanges();
          ctx.T_Person.FirstOrDefault(p => p.PersonID == id).T_PersonContakt = pContacts;

         ctx.SaveChanges();
         transaction.Commit();
     }
     catch (Exception e)
     {
         transaction.Rollback();
     }
 }

编辑3

就像我在编辑2中所说的那样,我的尝试是用标量SQL命令获取身份的当前值,但我不知道这是否安全,因为该应用程序被多个用户使用。

所以我不知道如果两个用户试图同时插入一个人是否会出现问题......

0 个答案:

没有答案