更新到数据库不保存

时间:2014-05-04 03:48:14

标签: c# sql linq entity-framework linq-to-entities

我正在研究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仍然为空。

有什么想法吗?

1 个答案:

答案 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将知道必须完成的操作。试着这样做。