我正在研究ASP.NET MVC应用程序,我正在使用实体框架和linq。
当我尝试更新数据库中未更新的记录时,我遇到了问题。
这是我正在上课的课程:
public class Customer
{
[Key]
[Required]
public int Id { get; set; }
[Required]
public string firstName { get; set; }
[Required]
public string surname { get; set; }
[Required]
public string userName { get; set; }
[Required]
public string password { get; set; }
[Required]
public bool subscription { get; set; }
public List<int> Articles { get; set; }
public void AddArticle(int id)
{
if (Articles != null)
{
Articles.Add(id);
}
else
{
Articles = new List<int> {id};
}
}
}
我已经基于上面的类创建了一个新条目并将其保存到数据库中,并且这个工作正常。我暂时将ListArticles留空了。
现在我得到了记录:
var customer = context.Customers.SingleOrDefault(o => o.Id == 1);
这里是customer.Articles == null
现在我添加它:
customer.AddArtical(0);
考虑到这一点,我可以看到它已经更新了变量客户,我需要将这些更新保存在数据库中。
我已经尝试过这里的所有示例,但似乎没有保存到数据库中 Entity Framework 5 Updating a Record
context.Customers.Attach(query);
context.Entry(query).State = EntityState.Modified;
context.SaveChanges();
完成此代码后,将调用项目的另一个区域并执行相同的查询:
var customer = context.Customers.SingleOrDefault(o => o.Id == 1);
但List<int> Articles
仍然为空。
有什么想法吗?
答案 0 :(得分:0)
我想你的项目中有一个实体Article
。毕竟,只有文章的id而不是文章本身并没有那么有用。关键是你的这个模型只有一个int列表,id列表而不是文章列表。
实体框架代码首先是基于约定的,因此要在实体之间建立关系,您需要在实体之间添加引用而不是它们的ID。想一想,你有一个整体列表,EF如何知道这些整数对应于id引用其他实体?它不是那样的。
如果你有这个,而是:
public class Customer
{
[Key]
[Required]
public int Id { get; set; }
[Required]
public string firstName { get; set; }
[Required]
public string surname { get; set; }
[Required]
public string userName { get; set; }
[Required]
public string password { get; set; }
[Required]
public bool subscription { get; set; }
public List<Article> Articles { get; set; }
public Customer()
{
this.Articles = new List<Article>();
}
}
然后,要添加文章,您将使用列表集合中的add方法添加实体本身。在您的情况下,您编写的添加方法似乎超级丰富。您正在使用它来避免空引用异常,但如果您在构造函数上实例化列表将没有问题。如果在添加文章时存在一些业务逻辑,则需要adition方法。
以这种方式做事你坚持EF惯例。当您添加文章时,EF将知道必须完成的操作。试着这样做。