在实体框架中获取密钥/ id如果存在行,则插入行并获取密钥

时间:2014-02-13 19:31:27

标签: c# entity-framework

我们有下表

TABLE [dbo].[SoftwareItems](
[SoftwareItemId] [int] IDENTITY(1,1) NOT NULL,
[Type] [varchar](32) NOT NULL,
[SoftwareItem] [varchar](100) NOT NULL)

获取行的密钥(如果存在或插入新行并返回新行的密钥)的最有效方法是什么。以下是我到目前为止:

var ctx = new Entities();
        var si = ctx.SoftwareItems.FirstOrDefault(s => s.SoftwareItem1.Equals(SoftwareItem) && string.Compare(s.Type, SoftwareItemType) == 0);
        if (si != null)
            return si.SoftwareItemId;
        else
        {
            si = new SoftwareItem();
            si.SoftwareItem1 = SoftwareItem;
            si.Type = SoftwareItemType;
            ctx.SoftwareItems.Add(si);
            ctx.SaveChanges();
            return si.SoftwareItemId;
        }    

1 个答案:

答案 0 :(得分:0)

避免加载整个现有对象并仅加载密钥的轻微改进将是:

var ctx = new Entities();
int? softwareItemId = ctx.SoftwareItems
    .Where(s => s.SoftwareItem1.Equals(SoftwareItem) &&
                string.Compare(s.Type, SoftwareItemType) == 0)
    .Select(s => (int?)s.SoftwareItemId)
    .FirstOrDefault();

if (softwareItemId.HasValue)
    return softwareItemId.Value;
else
{
    // your original code...
}