【问题标题】:Entity Framework: Return GUID from code-first stored procedure insert?实体框架:从代码优先存储过程插入返回 GUID?
【发布时间】:2014-01-03 18:27:17
【问题描述】:

我有一个 InsertPerson 存储过程,我需要它将 GUID(唯一标识符)返回到我正在创建的个人对象中。这甚至可以通过实体框架代码优先实现吗?我已经尝试了一切,实体框架忽略了我试图使用输出参数返回的 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;

【问题讨论】:

  • 你的 SP 长什么样,你怎么称呼它?
  • 你是如何调用存储过程的?
  • 您想将此存储过程映射到此实体的创建操作吗?如果是这种情况,您将不得不使用 EF6,它支持将 CUD 操作映射到 CodeFirst 应用程序中的存储过程 - msdn.microsoft.com/en-us/data/dn468673

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


【解决方案1】:

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

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());            
    }

插入人员存储过程

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'

【讨论】:

    【解决方案2】:

    我认为这可能对你有帮助:

    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();
    

    【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多