实体框架:从代码优先存储过程插入返回GUID?

时间:2014-01-03 18:27:17

标签: entity-framework ef-code-first entity-framework-5 code-first entity-framework-6

我有一个InsertPerson存储过程,我需要它将GUID(Uniqueidentifier)返回到我正在创建的person对象中。实体框架代码首先是否可能实现这一点?我已经尝试了一切,实体框架忽略了我尝试使用输出参数返回的guid。如果有可能,有没有人有例子?

Person.cs

public class Person
{
   public Guid Id { get; set; }
   public string FirstName { get; set; }
}

存储过程

CREATE PROCEDURE [dbo].[InsertPerson]
    @KeyPlayerId UNIQUEIDENTIFIER ,
    @FirstNameNVARCHAR(255) 
AS

-- Perform Insert
insert into [dbo.].[Person]....

-- Return GUID
select @Id as [Id];

END;

2 个答案:

答案 0 :(得分:1)

我能够通过告诉Entity Framework Id是数据库生成的值来实现它。我将Insert过程映射到PersonMap类中的InsertPerson,并在OnModelCreating方法中创建模型时使用它。在存储过程中,我生成一个新的Id并将其传递回Entity Framework。希望这有帮助!

<强> PersonMap.cs

public class PersonMap : EntityTypeConfiguration<Person>
{
    public PersonMap()
    {
        // Primary Key
        this.HasKey(t => t.Id);

        // Tell Entity Framework the database will generate the key.
        this.Property(t => t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        // Properties
        this.Property(t => t.FirstName)
            .IsRequired()
            .HasMaxLength(255);

        //Map to Stored Procedure
        this.MapToStoredProcedures(s => s.Insert(i => i.HasName("InsertPerson")));
    }
}

<强> OnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new PersonMap());            
    }

InsertPerson存储过程

CREATE PROCEDURE InsertPerson 
-- Since Id is marked as Database Generated we only need 
-- a parameter for First Name
@FirstName nvarchar(255) = 0 
AS
-- Variable to hold new Id
DECLARE @Id uniqueidentifier

-- Generate a new Id using NEWID function that returns a unique identifier
SET @Id = NEWID()

-- Perform Insert
INSERT INTO [dbo].[Person] VALUES (@Id, @FirstName)

-- Return the Id to Entity Framework
SELECT @Id AS 'Id'

答案 1 :(得分:0)

我认为这可能会对您有所帮助:

var sqlConnection1 = new SqlConnection("Your Connection String");
var cmd = new SqlCommand();
var reader;

cmd.CommandText = "StoredProcedureName";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = sqlConnection1;

sqlConnection1.Open();

reader = cmd.ExecuteReader();
rdr = cmd.ExecuteReader();
var outputValue = Guid.Parse(cmd.Parameters["@Response"].Value.ToString());

sqlConnection1.Close();