问题 将商品添加到2个单独型号的愿望清单中

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
我在尝试创建心愿单时遇到问题。

我有一个包含国家公园记录的数据库。
我也有一个包含远足者记录的数据库。

我在“公园详细信息”视图页面上有一个按钮,该按钮应该重定向到操作。
C#:
@Html.ActionLink("Add Park to Wish List", "AddParkToWishList", "Hiker", new { @id = Model.ParkId }, new { @class = "btn btn-default" })

该按钮正在传递停车ID,因此我已经通过参数获得了该ID。

我创建了一种方法来查找已登录的用户和当前公园,但是我一直试图将项目添加到数据库中。
C#:
public async Task<ActionResult> AddParkToWishList(int id)
        {
            string currentUser = FindRegisteredUserId(); // AspNetUser Id
            var currentHiker = _context.Hikers.Where(h => h.ApplicationId == currentUser); // Match against Hikers to find logged in user

            // Find current park
            var currentPark = _context.Parks.Where(p => p.ParkId == id).FirstOrDefault();

            HikerParkWishlistViewModel wishlist = new HikerParkWishlistViewModel()
            {
                wishlist.Hiker = currentHiker;
                // STUCK HERE. CAN'T ADD ANYTHING TO JUNCTION TABLE
            }

            await _context.SaveChangesAsync();
            return RedirectToAction("Details");
        }

我不确定Junction表应该是什么样子。
最初,我将其设置如下,但是遇到了与循环遍历单个对象有关的错误:
C#:
    public class HikerParkWishlist  // Junction table
    {
        [Key]
        public int HikerParkWishlistId { get; set; }

        [ForeignKey("Hiker")]
        public int HikerId { get; set; }
        public Hiker Hiker { get; set; }

        [ForeignKey("Park")]
        public int ParkId { get; set; }
        public string ParkName { get; set; }
        public Park Park { get; set; }
    }

我的前一篇帖子使我相信我应该尝试以下操作:
C#:
    public class HikerParkWishlist
    {
        [Key]
        public int HikerParkWishlistId { get; set; }

        [ForeignKey("Hiker")]
        public IEnumerable<Hiker> Hiker { get; set; }

        [ForeignKey("Park")]
        public IEnumerable<Park> Parks { get; set; }
    }

任何远足者都应该能够将任何/所有公园添加到其愿望清单中。
任何/所有远足者的愿望清单中都可以存在任何公园,因此应该是多对多关系(如果错了,请纠正我)

我要去哪里错了?

当前错误:
C#:
CS1922 C# Cannot initialize type with a collection initializer because it does not implement 'System.Collections.IEnumerable'

我觉得我应该使用IEnumerable或动作列表,但是我不确定如何实现它。
 
Last edited:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
<tongue-in-cheek>
这里的部分问题是您正在尝试以关系数据库的方式进行面向对象的操作。欢迎您首次体验对象关系阻抗不匹配。也许您应该使用面向对象的数据库,而不是使用诸如EntityFramework之类的ORM将对象楔入关系数据库中。
</tongue-in-cheek>

我不使用EF,但是对于功能强大的Google,这就是您要配置它以建立多对多关系的方式:
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,605
地点
弗吉尼亚州切萨皮克
编程经验
10+
Microsoft文档中的回答更简洁:
 

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
做到了。

在我的联结表上:
C#:
    public class HikerParkWishlist
    {
        public int HikerId { get; set; }
        public Hiker Hiker { get; set; }

        public int ParkId { get; set; }
        public string ParkName { get; set; }
        public Park Park { get; set; }
    }


远足者模型:
C#:
public class Hiker
    {
        [Key]
        public int HikerId { get; set; }
        ...
        public List<HikerParkWishlist> Wishlists { get; set; }
    }

公园模型:
C#:
    public class Park
    {
        [Key]
        public int ParkId { get; set; }
        ...
        [Display(Name = "Park Name")]
        public string ParkName { get; set; }
        public List<HikerParkWishlist> Wishlists { get; set; }
    }


这controller method:
C#:
        public async Task<ActionResult> AddParkToWishList(int id)
        {

            // Find logged in user to add to the correct wishlist
            string currentUser = FindRegisteredUserId();
            var currentHiker = _context.Hikers.Where(h => h.ApplicationId == currentUser).FirstOrDefault();

            // Find current park
            var currentPark = _context.Parks.Where(p => p.ParkId == id).FirstOrDefault();

            HikerParkWishlist wishlist = new HikerParkWishlist()
            {
                HikerId = currentHiker.HikerId,
                ParkId = currentPark.ParkId,
                ParkName = currentPark.ParkName
            };

            // make sure there are no duplicates
            bool parkExistsInWishlist = _context.HikerParkWishlists.Any(w => w.ParkId == wishlist.ParkId);
            if (parkExistsInWishlist == false)
            {
                _context.HikerParkWishlists.Add(wishlist);
                await _context.SaveChangesAsync();
            }

            return RedirectToAction("Details", "Hiker", new { id = currentHiker.HikerId });
        }

最后是ApplicationDbContext:
C#:
        public DbSet<HikerParkWishlist> HikerParkWishlists { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<HikerParkWishlist>()
                .HasKey(t => new { t.HikerId, t.ParkId }); // Have to add unique id to Junction Table

            modelBuilder.Entity<HikerParkWishlist>()
                .HasOne(h => h.Hiker)
                .WithMany(l => l.Wishlists)
                .HasForeignKey(hi => hi.HikerId); // Matches HasKey

            modelBuilder.Entity<HikerParkWishlist>()
                .HasOne(p => p.Park)
                .WithMany(w => w.Wishlists)
                .HasForeignKey(pi => pi.ParkId); // Matches HasKey
        }

这将内容添加到我的愿望清单!

看起来正确吗?还是看起来像它的混蛋版?
 

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
我最近创建了一种将商品添加到愿望清单的方法。

我正在使用Park和Hiker模型,并且创建了愿望清单以合并两个表中的值。

信息可以很好地保存到“愿望清单”表中,但是尝试遍历每条记录时出现错误。

公园模型:
C#:
 public class Park
    {
        [Key]
        public int ParkId { get; set; }
        [Display(Name = "Park Name")]
        public string ParkName { get; set; }
        ...
        public List<HikerParkWishlist> Wishlists { get; set; }
    }


远足者型号:
C#:
public class Hiker
    {
        [Key]
        public int HikerId { get; set; }
        ...
        public List<HikerParkWishlist> Wishlists { get; set; }
    }

HikerPark连接表:
C#:
    public partial class HikerParkWishlist
    {
        public int HikerId { get; set; }
        public Hiker Hiker { get; set; }

        public int ParkId { get; set; }
        public string ParkName { get; set; }
        public Park Park { get; set; }
    }

然后在我看来,我试图使用局部视图:
C#:
<partial name="../Shared/_WishlistPartialView.cshtml" for="Wishlists" />
~View/Shared... method does not work for me

部分视图:
C#:
@model walkinthepark.Models.HikerParkWishlist

<h3 class="text-center">National Parks Wishlist</h3>
@foreach (var item in Model.Wishlists)
    {
        <p>@Html.DisplayFor(modelItem => item.ParkName)</p>
    }

未将Ienumerator设置为实例,因为它返回null错误
 

米切尔恩11

活跃成员
已加入
2020年4月10日
留言内容
39
编程经验
Beginner
-------------------------
更新:

添加了一个新列表,以允许foreach循环枚举通过
更新的部分视图:
C#:
@model walkinthepark.Models.HikerParkWishlist

<h3 class="text-center">National Parks Wishlist</h3>
@{
    // Create an empty list for the marker values to add into
    List<walkinthepark.Models.HikerParkWishlist> wishlist = new List<HikerParkWishlist>();
}

@foreach (var item in wishlist)
{
    HikerParkWishlist wishlistItems = HikerParkWishlist();

    wishlistItems.ParkName = item.ParkName;
    wishlist.Add(wishlistItems);

    <p>@Html.DisplayFor(modelItem => item.ParkName)</p>
}

这<h3>现在显示,但循环不返回任何内容,因此一定是错误的。
 

羊皮

知名会员
已加入
2018年9月5日
留言内容
1,982
编程经验
10+
代码在技术上是相同的,因此我为您合并了您的主题,因为在对相同的有问题的代码进行故障排除时无需创建新主题。除非代码和问题完全不同。

很抱歉,我没有时间在他们面前检查您的问题。如果以后再找时间,今晚我来看看。
 
最佳 底部