2016-10-04 83 views
0

我是ASP.NET的新手,并且遇到了有重复记录的非常奇怪的问题。我将深入到代码在这里:ASP.NET MVC在创建对象上创建重复记录

我有一个公司模型定义为:

public class Company 
{ 
    [Key] 
    public int ID { get; set; } 

    public DateTime DateCreated { get; set; } 
    public virtual SubscriptionType SubscriptionType { get; set; } 

    [Required] 
    [Display(Name = "Company Name")] 
    public String Name { get; set; } 
} 

public class CompanyDBContext : DbContext 
{ 
    public DbSet<Company> Companies { get; set; } 
} 

而定义的SubscriptionType模型:

public class SubscriptionType 
{ 
    [Key] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

public class SubscriptionTypeDBContext : DbContext 
{ 
    public DbSet<SubscriptionType> SubscriptionTypes { get; set; } 
} 

的SubscriptionType数据在种子功能设置与以下内容:

var subscriptionTypes = new List<SubscriptionType> 
     { 
      new SubscriptionType { Name= "Free" }, 
      new SubscriptionType { Name= "Business" }, 
      new SubscriptionType { Name= "Enterprise" }, 
     }; 
     subscriptionTypes.ForEach(s => context.SubscriptionTypes.AddOrUpdate(p => p.Name, s)); 
     context.SaveChanges(); 

而当我尝试创建一个用户在公共异步任务R egister功能(我使用的是默认ApplicationUser)我用下面的代码创建一个公司,当用户注册:

ApplicationDbContext db = new ApplicationDbContext(); 
      var subscription = db.SubscriptionTypes.Find(1); 
      var company = new Company { Name = model.CompanyName, DateCreated = DateTime.UtcNow, SubscriptionType = subscription }; 
      var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Company = company }; 
      var result = await UserManager.CreateAsync(user, model.Password); 

现在 - 公司应该有1套为SubscriptionType_ID,而是它创造一个在SubscriptionType表中重复记录,并设置SubscriptionType_ID到4

ID | Name 
----------- 
1 | Free 
2 | Business 
3 | Enterprise 
4 | Free 

这是我ApplicationDBContext:

public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    public DbSet<SubscriptionType> SubscriptionTypes { get; set; } 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Project> Projects { get; set; } 
    public DbSet<Collection> Collections { get; set; } 

它为什么会CREA在这种情况下重复记录?

+0

尝试向您的标签列表添加实体框架 – mahlatse

+0

您的公司类需要外键导航属性 - [关系和导航属性](https://msdn.microsoft.com/zh-cn/data/jj713564。 aspx) –

+0

我尝试添加SubscriptionTypeID - 不幸的是问题仍然存在。 – Chris

回答

0

您建立Company新的类实例 - 从实体框架的角度来看 - 这是全新的Company,这恰好具有相同Name值(你可以在这里阅读更多:Entity Framework Change Tracking)。

如果您的公司提供的公司已经存在于您的数据库中,并且您的公司应该检索该公司并将其分配给财产ApplicationUser类,您应该进行合理检查。

+0

谢谢你的回应,但是重复的记录是SubscriptionType。应该只有3个,它们是在Seed函数中创建的,但是它不是必须的。由于某种原因,当我创建一个新公司时,它创建了一个重复的记录 – Chris

+0

噢,我很抱歉 - 我错过了那部分,我们正在讨论'SubscriptionType'。你是否尝试过使用'var subscription = db.SubscriptionTypes .FirstOrDefault(type => type.ID == 1);'Find通过主键执行搜索 - 如果'FirstOrDefault'不会导致重复的'SubscriptionType',那么我猜这里有一些ID是主键的事情不对。 –

+0

我刚刚尝试了您的建议 - 但似乎仍然在SubscriptionType表中创建了一条新记录。 – Chris