【问题标题】:Update to database does not save数据库更新不保存
【发布时间】:2014-05-04 03:48:14
【问题描述】:

我正在开发一个 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);

查看这个我可以看到它已经更新了变量 customer,现在我需要将这些更新保存在数据库中。

我已经尝试了这里的所有示例,但似乎没有一个可以保存到数据库中 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&lt;int&gt; Articles 仍然为空。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    我想您的项目中有一个实体Article。毕竟,只有文章的 id 而不是文章本身并没有多大用处。关键是您的这个模型只有一个整数列表,即 id 列表,而不是文章列表。

    Entity Framework Code First 是基于约定的,因此要建立实体之间的关系,您需要在实体本身而不是它们的 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 方法添加实体本身。在您的情况下,您编写的加法方法似乎是多余的。您正在使用它来避免空引用异常,但是如果您在构造函数上实例化列表,则不会有任何问题。如果添加文章有一些业务逻辑,则需要添加方法。

    以这种方式做事就是在遵守 EF 约定。当你添加一篇文章时,EF 会知道它必须做什么。尝试这样做。

    【讨论】:

    • 您好,虽然我同意您所说的是好的做法,并且可能是正确的做法。但是它没有回答为什么我不能添加到整数列表并更新数据库的问题
    • 它不起作用的原因仅仅是 EF 不知道如何映射该整数列表。让 EF 使用您提供的模型为您构建数据库,然后查看生成的数据库。没有地方可以存放它。
    猜你喜欢
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多