我正在开发公告板系统(作为我对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);
}
问题是,可以将所有相关模型一起发布到广告中。在深入潜水之前,我想确保我正确地做到这一点。
感谢。
答案 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
}