2009-06-19 48 views
0

我有两个表用于跟踪我的网站上的用户会话。这是一个过于简单化BTW:在LINQ中自动连接外键的最有效方法

Campaign: 
    campaignId [int] 
    campaignKey [varchar(20)] 
    description [varchar(50)] 

Session: 
    sessionDate [datetime] 
    sessionGUID [uniqueidentifier] 
    campaignId [int] 
    campaignKey [varchar(20)] 

我要插入一个新记录会话,使用LINQ:

 var s = new Session(); 
    dbContext.Session.InsertOnSubmit(s); 

    s.sessionDate = DateTime.Now; 
    s.sessionGUID = Guid.NewGuid(); 
    s.campaignKey = Request.Params["c"]; 
    // dont set s.campaignId here... 

    dbContext.SubmitChanges(); 

请注意,我不是目前这个代码设置campaignId

我想要的是东西到automaticaly联播的外键“运动”表,不管用什么方法,必须先添加一个新行“活动”表如果传入的活动从未使用过之前。

我有一些需要作出决定,真的希望任何人的见解:

  • 我不知道我是否应该在LINQ手动使用触发器,存储过程或做到这一点:

    • 触发:轻微恶心,从来没有真正使用他们喜欢的,但将保证“CAMPAIGNID”是由时间更新我需要它

    • 存储过程:再次稍微恶心,我的SQL不是很好,我非常重视能够尽可能在LINQ中做所有事情的一致性。

    • Linq手动:我必须在内存中保留一份'Campaign'表,并使用C#哈希表来查找。如果其他客户添加了新的广告系列,我就不用担心保持该表的最新状态。

  • 我主要的两个原因,希望这个外键表是在“会议”的“CAMPAIGNID”这样我就可以做分组更快更有效的指标。它只是好像它应该是更快,如果它只是一个整数列被分组。第二个原因是让合作伙伴有权通过与其他表的联合来查看他们的广告系列。

之前有人问我提前不知道的活动,因为有些将由合作伙伴创建。

最重要的是:我主要是在寻找最“LINQ友好”的解决方案。

+0

嗨,Simon,是在数据库中映射的Fk关系,这是在Linq2SQL模型中显示的? – 2009-06-25 07:50:29

+0

@littlegeek - 没有FK关系,但我可以添加一个。事实上,现在在Session表中有很多行,Campaign中没有条目。我想在理论上我可以捕捉异常的外键约束异常,然后在那一点添加一行。那也听起来也是咯咯地笑 – 2009-06-25 21:08:14

回答

1

我肯定会建议在会话表上添加一个可空的外键约束。一旦你的设置,它应该是作为一种方法来套结会话类一样简单:

public partial class Session 
{ 
    public void SetCampaignKey(string key) 
    { 
     // Use an existing campaign if one exists 
      Campaign campaign = 
      from c in dbContext.Campaigns 
      where c.campaignKey == key 
      select c; 

     // Create a new campaign if necessary 
     if (campaign == null) 
     { 
      campaign = new Campaign(); 
      campaign.campaignKey = key; 
      campaign.description = string.Empty; // Not sure where this comes in 
      dbContext.Campaign.InsertOnSubmit(campaign); 
     } 

     // We can now set the reference directly 
     this.Campaign = campaign; 
    } 
} 

我的LINQ可能有点过,但这样的事情应该工作。

您可以调用SetCampaignKey()而不是手动设置campaignKey属性。当您调用dbContext.SubmitChanges时,将根据需要添加该活动,并且会话条目将相应更新。

在这种情况下,只会自动设置campaignId属性。你可以依靠一个简单的触发器来设置campaignKey或者取消它。您始终可以通过加入Campaign表来检索该值。

我是不是简单化了这个问题?