您好我正在使用以下代码将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,并且它应该只获取一次而不是重复记录。
答案 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");