从数据库中检索数据时,我得到一个空值,如何解决这个问题?

时间:2017-04-30 20:35:55

标签: c# asp.net asp.net-mvc entity-framework-5

首先,我正在使用ASP.net MVC 5 Framework。我试图访问Bid Model类并在数据库中检索我的用户名。但这不起作用。

以下是我的拍卖控制器 - (我评论了需要更改的区域)

            var result = auction.Bids.Where(c => c.AuctionId.ToString() == bid.AuctionId.ToString()&&c.Amount> bid.Amount);
            //I want to get my username in bids model, but it is not retrieving........................................
            if (result.Equals(null))
                {

                    TempData["Hello"] = "Sorry the bid has been expired!";
                        return RedirectToAction("Auction", new { id = bid.AuctionId });
                }
                else
                {
                    TempData["Hello"] = "Bid has a won person";

                    return RedirectToAction("Auction", new { id = bid.AuctionId });
                }
                //TempData["Hello"] = "This bid has expired!";


        }
        else
        {
            var result = db.Bids.Where(c => c.AuctionId.Equals(bid.AuctionId));
            if (result.Equals(" "))
            {
                TempData["Hello"] = "Sorry the bid has been expired!";
                return RedirectToAction("Auction", new { id = bid.AuctionId });
            }
            else
            {
                TempData["Hello"] = "Bid has a won person";
                return RedirectToAction("Auction", new { id = bid.AuctionId });
            }
           //TempData["Hello"] = "This bid has expired!";

        }

以下是我的拍卖模式

using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace Samurai.Models
    {
        public class Auction
        {
            [Key]
            [Required]
            public long Id { get; set; }


            public virtual Collection<Bid> Bids { get; private set; }

            public int BidCount
            {
                get { return Bids.Count; }
            }
            public Auction()
            {
                Bids = new Collection<Bid>();
                CurrentPrice = 0;

            }
        }
    }

以下是我的出价模式

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Samurai.Models
{
    public class Bid
    {
        [Key]
        [Required]
        public long Id { get; internal set; }

        [Required]
        public long AuctionId { get; set; }

        [Required]
        public string Username { get; set; }

        [Required]
        [Range(1, double.MaxValue)]
        public decimal Amount { get; set; }

        public Bid()
        {
            Timestamp = DateTime.Now;
        }
    }
}

请帮我解决这个问题。我受到了很多努力,但我仍然无法理解......这是我正在努力的第四天......请帮助我......

这是ActionResult出价部分中出现空值的地方

 var result = auction.Bids.Where(c => c.AuctionId.ToString() == bid.AuctionId.ToString()&&c.Amount> bid.Amount);

这需要改变,但我不知道如何改变这一点,我尝试了不同的方法......但是它没有用......

我要做的是:

(我正在尝试这里,在投标模型中 - 我定义了一个用户名部分。所以,我想检索参考出价ID的值)

但我多次尝试在投标模型中获取用户名,但&#34;结果&#34;变量总是为空......

我试图传递拍卖ID并检索列表,但它是一样的...... :(

我附上了一些照片,希望能给你一些信息.. 请帮帮我

检查指向对象的详细信息 - &#34; i.stack.imgur.com/Ecd25.png"

Auction database

Bid Database

感谢....

2 个答案:

答案 0 :(得分:0)

我的建议是调试方法并查看问题是否与数据相关。这样,您可以知道查找是否因为金额和/或字符串转换而失败。

所以首先尝试使用更改这一行:

var result = auction.Bids.Where(c => c.AuctionId == bid.AuctionId);

如果有效,则添加Amount过滤器:

var result = auction.Bids.Where(c => c.AuctionId == bid.AuctionId && c.Amount > bid.Amount);

我的直觉告诉我,因为 Amount ,因为字符串转换虽然不必要但仍然有效。

<强> 编辑:

经过一些阅读后,问题可能是您的虚拟集合没有被急切加载,请尝试使用include,这会强制查询查找嵌套实体。

试试这个:

var auction = db.Auctions.Include(a => a.Bids).SingleOrDefault(a => a.Id  == bid.AuctionId);

有关包含的详情,请参阅msdn

答案 1 :(得分:0)

在这一行你是使用auction.Bids喜欢EntityFramework集合。但我发现你没有用1对多关系来设计你的模型。 因此,当您尝试呼叫时,您的出价必须为空。

我的建议1:对于使用EntityFramework自动收集延迟加载,你必须使用1到多个关系模型化。

2:或者你必须像这样更新你的代码:

db.Bids.Where(c => c.AuctionId == bid.AuctionId && c.Amount> bid.Amount);

所以,直接从db上下文查询。不在拍卖会上。因为它在这个设计中会为null。 (直到你加载)