C# 首先从现有数据库中编写如何使用关系的代码

C# 首先从现有数据库中编写如何使用关系的代码,c#,winforms,entity-framework,ef-code-first,C#,Winforms,Entity Framework,Ef Code First,我有一个包含3个表的数据库。旅游、优惠和旅游优惠。旅游包含旅游的地点和价格。优惠是旅游的特别优惠,旅游商店什么旅游有什么优惠 举例如下: 当我首先从现有的DB生成代码时,从表Tours和Offers创建了两个类 如何使用ToursOffers表来保持表之间的关系?例如,旅游在组合框中,我如何在文本框中显示所选的旅游产品 我的功能代码: private void onload(object sender, EventArgs e)//Populate Product Name drop down

我有一个包含3个表的数据库。旅游、优惠和旅游优惠。旅游包含旅游的地点和价格。优惠是旅游的特别优惠,旅游商店什么旅游有什么优惠

举例如下:

当我首先从现有的DB生成代码时,从表Tours和Offers创建了两个类

如何使用ToursOffers表来保持表之间的关系?例如,旅游在组合框中,我如何在文本框中显示所选的旅游产品

我的功能代码:

private void onload(object sender, EventArgs e)//Populate Product Name drop down. 
    {
        Tours tour = new tours();

        dataSource = tour.GetAll();
        comboBox1.DisplayMember = "Tour"; // set display member
        comboBox1.ValueMember = "PID"; // value member as Id to use at selectedIndex changed
        comboBox1.DataSource = dataSource;

        offerSource = tour.GetAllOffers();

    }

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

            comboBox1.DataSource = dataSource;
            decimal price = dataSource.Where(x => x.PID == (int)comboBox1.SelectedValue)
                            .FirstOrDefault().Price.Value;

            textBox1.Text = price.ToString("0.00"); // set result to two decimal places
            textBox2.Text = //RELATED OFFER
}
我有一个想法:

 string offers = offerSource
                 .Where(x => x.Equals(comboBox1.SelectedValue))
                 .FirstOrDefault().OfferDescription; 
发生System.NullReferenceException HResult=0x80004003
Message=对象引用未设置为对象的实例

编辑1

课程简介:

    public partial class Tour
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public Tour()
            {
                Offers = new HashSet<Offer>();
            }

            public int PID { get; set; }

            [Required]
            [StringLength(40)]
            public string Tour { get; set; }

            [Column(TypeName = "money")]
            public decimal? Price { get; set; }

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<Offer> Offers { get; set; }
        }
public partial class Offer
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public Offer()
            {
                Products = new HashSet<Product>();
            }

            public int OfferID { get; set; }

            [Required]
            [StringLength(60)]
            public string Desc { get; set; }

            [StringLength(10)]
            public string Code { get; set; }
    }
公共部分班级巡回演出
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公众旅游()
{
Offers=newhashset();
}
公共int-PID{get;set;}
[必需]
[行政长官(40)]
公共字符串巡更{get;set;}
[列(TypeName=“money”)]
公共十进制?价格{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection提供{get;set;}
}
提供生成的类:

    public partial class Tour
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public Tour()
            {
                Offers = new HashSet<Offer>();
            }

            public int PID { get; set; }

            [Required]
            [StringLength(40)]
            public string Tour { get; set; }

            [Column(TypeName = "money")]
            public decimal? Price { get; set; }

            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<Offer> Offers { get; set; }
        }
public partial class Offer
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public Offer()
            {
                Products = new HashSet<Product>();
            }

            public int OfferID { get; set; }

            [Required]
            [StringLength(60)]
            public string Desc { get; set; }

            [StringLength(10)]
            public string Code { get; set; }
    }
公共部分课程优惠
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公开发售()
{
Products=新的HashSet();
}
公共int OfferID{get;set;}
[必需]
[条次建议修正案(60)]
公共字符串Desc{get;set;}
[条次建议修正案(10)]
公共字符串代码{get;set;}
}
和型号:

public Model1()
    : base("name=Model1")
{
}

public virtual DbSet<Offer> Offers { get; set; }
public virtual DbSet<Tour> Tours { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Offer>()
        .Property(e => e.Code)
        .IsFixedLength();

    modelBuilder.Entity<Offer>()
        .HasMany(e => e.Tours)
        .WithMany(e => e.Offers)
        .Map(m => m.ToTable("TourOffers").MapLeftKey("OfferID").MapRightKey("PID"));

    modelBuilder.Entity<Tour>()
        .Property(e => e.Price)
        .HasPrecision(19, 4);
}
publicmodel1()
:base(“name=Model1”)
{
}
公共虚拟数据库集提供{get;set;}
公共虚拟数据库集{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(e=>e.Code)
.IsFixedLength();
modelBuilder.Entity()
.HasMany(e=>e.Tours)
.WithMany(e=>e.Offers)
.Map(m=>m.ToTable(“TourOffers”).MapLeftKey(“OfferID”).MapRightKey(“PID”);
modelBuilder.Entity()
.物业(e=>e.价格)
.精确性(19,4);
}

@MickyD Ha是的,这听起来确实很奇怪,但这正是微软文档所说的令人惊奇的!那边的人应该被一块柠檬打一巴掌……包裹在一块大金砖上。;)包括代码优先实体您有相关的模型(对象/类)可以添加到您的问题中,我们可以看一下吗?另一方面,您可以使用
dataSource.FirstOrDefault(x=>x.PID==(int)comboBox1.SelectedValue)简化linq查询同样适用于您的另一部分code@12seconds是的,给我12秒钟,我会在编辑中发布