如何避免在Entity框架中获得重复结果

时间:2013-08-19 14:53:43

标签: asp.net-mvc entity-framework

您好我正在使用以下代码将Gateway_users表中的userID提取到Appterms表。但问题是每当我运行解决方案时我都会获得重复记录,这是第一次有100条带有ID的记录,第二次有200条带有重复ID的记录等等。

 public class HomeController : Controller
  {
    private AppMarketplaceEntities db = new AppMarketplaceEntities();
    private InstallTrackerEntities db1 = new InstallTrackerEntities();

    public ActionResult Index()
    {      
   List<int> gatewayUserId = new List<int>();

        using (var ctx = new InstallTrackerEntities())
        {
            gatewayUserId = ctx.Gateway_Users.Select(f => f.GatewayuserUID).ToList();
        }
        using (var ctx2 = new AppMarketplaceEntities())
        {
            foreach (var id in gatewayUserId)
            {

                ctx2.AppTerms.Add
                    (new AppTerm(){ GatewayuserUID = id });
            }
            ctx2.SaveChanges();
        }

        return View();  
     } } }

那么我必须对上面的代码进行哪些更改才能获得Gateway_users表中存在的ID,并且它应该只获取一次而不是重复记录。

2 个答案:

答案 0 :(得分:2)

发生的事情是您始终将InstallTrackerEntities GatewayuserUID列表添加到AppMarketplaceEntities AppTerms列表中,您想要的只是插入新的列表。

首先,如果您要删除InstallTrackerEntities中不再存在的那些,最简单的方法是清除AppTerms表并插入新列表,如Tony Lunt所说。

只是插入那些是新的创建一个已经在AppMarketplaceEntities中的列表并且只插入不存在的那些

    using (var ctx = new InstallTrackerEntities())
    {
        gatewayUserId = ctx.Gateway_Users.Select(f => f.GatewayuserUID).ToList();
    }
    using (var ctx2 = new AppMarketplaceEntities())
    {
        var appTermsUIDs = ctx2.AppTerms.Select(f => f.GatewayuserUID).ToList();

        foreach (var id in gatewayUserId.Where(e => !appTermsUIDs.Contains(e)))
        {
            ctx2.AppTerms.Add(new AppTerm(){ GatewayuserUID = id });
        }
        ctx2.SaveChanges();
    }

答案 1 :(得分:0)

如果您希望每次只收到新ID,则需要清除第二个表(ctx2.AppTerms)。否则,您只是在旧数据之上添加新数据。这可以解释“重复”。有关此示例,请参阅以下答案:https://stackoverflow.com/a/15220460/1634770。基本上,你需要做这样的事情:

var objCtx2 = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)ctx2).ObjectContext;
objCtx2.ExecuteStoreCommand("TRUNCATE TABLE AppTerms");