更新相关实体之一

时间:2016-10-26 12:47:35

标签: asp.net-core-mvc entity-framework-core

我正在开发公告板系统(作为我对asp.net mvc培训的一部分)。我对数据建模有基本的了解,但我怀疑我创建模型的方式。核心逻辑是发布具有以下类别的广告,自动和服务。最初我尝试使用TPH方法,但后来面临绑定我的模型和automapper配置的问题。现在我认为使用零或一个关系。

我有广告模型:

public class Ad
{
    public int ID { get; set; }

    public string Title { get; set; }

    public string Description { get; set; }

    public virtual Realty Realty { get; set; }

    public virtual Auto Auto { get; set; }

    public virtual Service Service { get; set; }
}

地产:

public class Realty
{
    [Key]
    [ForeignKey("Ad")]
    public int AdID { get; set; }

    public string Type { get; set; }

    public string NumberOfRooms { get; set; }

    public virtual Ad Ad { get; set; }
}

自动和服务模型与Realty模型具有相同的外键。

我的数据库上下文:

public DbSet<Ad> Ads { get; set; }
public DbSet<Realty> Realties { get; set; }
public DbSet<Auto> Autos { get; set; }
public DbSet<Service> Services { get; set; }

我只需要使用一个相关模型更新广告模型。我使用脚手架控制器操作,其中包括所有相关模型:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "Title,Descirpiton,Realty,Auto,Service")] Ad ad)
{
    if (ModelState.IsValid)
    {
        db.Ads.Add(ad);
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }

    ViewBag.ID = new SelectList(db.Autos, "AdID", "CarType", ad.ID);
    ViewBag.ID = new SelectList(db.Realties, "AdID", "Type", ad.ID);
    ViewBag.ID = new SelectList(db.Services, "AdID", "ServiceType", ad.ID);
    return View(ad);
}

问题是,可以将所有相关模型一起发布到广告中。在深入潜水之前,我想确保我正确地做到这一点。

感谢。

1 个答案:

答案 0 :(得分:1)

你很亲密。根据您尝试做的事情,您应该使用每个类型的表模型。您创建基础(Ad),然后从中继承以创建子类型。

public class Ad
{
    [Key]
    public int ID { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}

[Table("Realty")]
public class Realty : Ad
{
    public string Type { get; set; }
    public string NumberOfRooms { get; set; }
}

您的背景保持不变。现在,您可以在知道正在创建的广告类型时创建相应的子类型。

var ad = new Realty();
ad.Title = "...";
ad.Description = "...";
ad.Type = "...";
ad.NumberOfRooms = "...";

您可以使用上下文中的特定类型检索特定广告类型。

db.Realty.ToList();

或者,您可以检索所有广告,并在循环播放时询问这些类型。

var ads = db.Ads.ToList();

foreach(var ad in ads)
{
    if(ad is Realty)
        // do Realty stuff
    else if (ad is Auto)
        // do Auto stuff
}