【发布时间】:2016-10-04 05:38:54
【问题描述】:
我是 ASP.NET 新手,遇到了一个非常奇怪的重复记录问题。我将在这里深入研究代码:
我有一个公司模型定义为:
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 数据在 Seed 函数中设置如下:
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();
当我尝试在公共异步任务注册功能中创建用户时(我使用默认的 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; }
为什么会在这种情况下创建重复记录?
【问题讨论】:
-
尝试将实体框架添加到您的标签列表中
-
您的公司类需要外键的导航属性 - Relationships and Navigation Properties
-
我尝试添加 SubscriptionTypeID - 不幸的是问题仍然存在。
-
如果您正确定义了导航属性(并且您在保存时设置了
SubscriptionTypeID的值(而不是SubscriptionType),则问题不会持续存在 -
但是当
SubscriptionType像在问的问题中那样分配时,它应该真的有效,不是吗?我的意思是您不必显式分配外键。
标签: c# asp.net asp.net-mvc