Asp.net core mvc 正在更新一个相关实体

Asp.net core mvc 正在更新一个相关实体,asp.net-core-mvc,entity-framework-core,Asp.net Core Mvc,Entity Framework Core,我正在开发布告栏系统(作为asp.NETMVC培训的一部分)。我对数据建模有一个基本的了解,但我对我创建模型的方式有一个疑问。核心逻辑是发布以下类别的广告:房地产、汽车和服务。起初,我尝试使用TPH方法,但后来面临绑定模型和automapper配置的问题。现在我想使用零或一个关系 我有一个广告模型: public class Ad { public int ID { get; set; } public string Title { get; set; } publi

我正在开发布告栏系统(作为asp.NETMVC培训的一部分)。我对数据建模有一个基本的了解,但我对我创建模型的方式有一个疑问。核心逻辑是发布以下类别的广告:房地产、汽车和服务。起初,我尝试使用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; }
}
汽车和服务模型与房地产模型具有相同的外键

我的数据库上下文:

public DbSet<Ad> Ads { get; set; }
public DbSet<Realty> Realties { get; set; }
public DbSet<Auto> Autos { get; set; }
public DbSet<Service> Services { get; set; }
公共数据库集Ads{get;set;}
公共数据库集不动产{get;set;}
公共数据库集自动{get;set;}
公共数据库集服务{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);
}
[HttpPost]
[ValidateAntiForgeryToken]
公共异步任务创建([Bind(Include=“Title,Descirpiton,Realty,Auto,Service”)]Ad)
{
if(ModelState.IsValid)
{
db.Ads.Add(ad);
等待db.saveChangesSync();
返回操作(“索引”);
}
ViewBag.ID=新选择列表(db.Autos,“AdID”,“CarType”,ad.ID);
ViewBag.ID=新的选择列表(db.Realties,“AdID”,“Type”,ad.ID);
ViewBag.ID=新选择列表(db.Services,“AdID”,“ServiceType”,ad.ID);
返回视图(ad);
}
问题是,它使得所有相关模型一起发布广告成为可能。在深入潜水之前,我想确保我的方法是正确的


谢谢。

很接近了。根据您试图执行的操作,您应该使用每种类型的表模型。创建基础(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
}

这看起来可能是每类型表(TPT)建模的教科书示例。谢谢克雷格,还有一个问题。我想为适当的子类型实现单个创建操作,这取决于视图中的用户选择。我应该向哪个方向寻求?谢谢。我不太明白你的问题。一旦您完全实现了实体类,您可能应该发布一个新的问题,其中的细节可能比在注释中要详细。