C# 如何为复杂的EF模型制作剃须刀形状
我开始怀疑我要问的是否可能。。但应该是这样 MS的例子与我所追求的相差甚远,所以可能EF的设计方式与我的想法不符。(顺便说一句,每个表的CRUD Scaffold都很好。但它只做表级创建。我需要一个对象来管理关系。)C# 如何为复杂的EF模型制作剃须刀形状,c#,entity-framework,entity-framework-6,asp.net-core-2.1,razor-pages,C#,Entity Framework,Entity Framework 6,Asp.net Core 2.1,Razor Pages,我开始怀疑我要问的是否可能。。但应该是这样 MS的例子与我所追求的相差甚远,所以可能EF的设计方式与我的想法不符。(顺便说一句,每个表的CRUD Scaffold都很好。但它只做表级创建。我需要一个对象来管理关系。) 公共类联系人电话 { 公共联络电话(联络电话) { Id=contactPhone.Id; ContactId=contactPhone.ContactId; ContactPhoneTypeId=contactPhone.ContactPhoneTypeId; 号码=联系电话号码
公共类联系人电话
{
公共联络电话(联络电话)
{
Id=contactPhone.Id;
ContactId=contactPhone.ContactId;
ContactPhoneTypeId=contactPhone.ContactPhoneTypeId;
号码=联系电话号码;
}
//私人联络电话;
公共联络电话()
{
}
//公共联络电话(联络电话)
//{
//this.contactPhone=contactPhone;
//}
公共int Id{get;set;}
public int ContactId{get;set;}
公共虚拟联系人联系人{get;set;}
public int ContactPhoneTypeId{get;set;}
公共虚拟联系人电话类型联系人电话类型{get;set;}
公共字符串编号{get;set;}
}
公共类联系人
{
公众联络()
{
电话=新列表();
}
公共int Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串电子邮件{get;set;}
public int LocationAddressId{get;set;}
公共位置地址地址{get;set;}
public int UserId{get;set;}
[外键(“用户ID”)]
公共虚拟SCPI_站点_用户{get;set;}
//公共ICollection
公共列表电话{get;set;}
}
我知道这是错误的,但它有点工作…我的假设是我的接触是持久的,在剃须刀页面之间来回传递,但事实似乎并非如此
public class CreateModel : PhoneTypesPageModel
{
private readonly SCPI_Site.Areas.SCPI_SiteContext _context;
public CreateModel(SCPI_Site.Areas.SCPI_SiteContext context)
{
_context = context;
}
[TempData]
public string Message { get; set; }
[BindProperty]
public Contact Contact { get; set; }
[BindProperty]
public ContactPhone ContactPhone { get; set; }
//public bool HasPhones => Contact.Phones.Count > 0;
public IActionResult OnGet()
{
PopulatePhoneTypeDropDownList(_context);
int userID = User.Identity.GetUserId<int>();
if (Contact == null)
{
Contact = new Contact();
}
if (ContactPhone == null)
{
Contact = new Contact();
}
Contact.UserId = userID;
ViewData["UserId"] = userID;
return Page();
}
public async Task<IActionResult> OnPostAsync(string submit)
{
int userID = User.Identity.GetUserId<int>();
Contact.UserId = userID;
switch (submit)
{
case "AddPhone":
// (failed attempt) _context.ContactPhone.Add(ContactPhone);
Contact.Phones.Add(new ContactPhone(ContactPhone));
ContactPhone.Number = "";
return Page();
default:
//if (!ModelState.IsValid)
//{
// return Page();
//}
_context.Contact.Add(Contact);
await _context.SaveChangesAsync();
Message = "Contact Created!";
return RedirectToPage("./Index");
}
}
}
}
公共类CreateModel:PhoneTypesPageModel
{
私有只读SCPI_Site.Areas.SCPI_SiteContext_context;
公共CreateModel(SCPI_Site.Areas.SCPI_SiteContext上下文)
{
_上下文=上下文;
}
[临时数据]
公共字符串消息{get;set;}
[BindProperty]
公共联系人{get;set;}
[BindProperty]
公共联系人电话联系人电话{get;set;}
//public bool HasPhones=>Contact.Phones.Count>0;
公共IActionResult OnGet()
{
PopulatePhoneTypeDropDownList(_上下文);
int userID=User.Identity.GetUserId();
if(Contact==null)
{
触点=新触点();
}
如果(ContactPhone==null)
{
触点=新触点();
}
Contact.UserId=UserId;
ViewData[“UserId”]=UserId;
返回页();
}
公共异步任务OnPostAsync(字符串提交)
{
int userID=User.Identity.GetUserId();
Contact.UserId=UserId;
切换(提交)
{
案例“AddPhone”:
//(尝试失败)\ u context.ContactPhone.Add(ContactPhone);
Contact.Phones.Add(新ContactPhone(ContactPhone));
ContactPhone.Number=“”;
返回页();
违约:
//如果(!ModelState.IsValid)
//{
//返回页();
//}
_context.Contact.Add(Contact);
wait_context.SaveChangesAsync();
Message=“已创建联系人!”;
返回页首(“/索引”);
}
}
}
}
HTML:
@page
@模型SCPI_Site.Areas.ContactModel.Pages.Contacts.CreateModel
@{
//Layout=“~/Views/Shared/_AdminLayout.cshtml”;
ViewData[“标题”]=“创建”;
}
接触
@如果(Model.Contact.Phones!=null)
{
类型
@*@Html.DisplayNameFor(model=>model.Contact.Phones[0].ContactPhoneType)*@
public class CreateModel : PhoneTypesPageModel
{
private readonly SCPI_Site.Areas.SCPI_SiteContext _context;
public CreateModel(SCPI_Site.Areas.SCPI_SiteContext context)
{
_context = context;
}
[TempData]
public string Message { get; set; }
[BindProperty]
public Contact Contact { get; set; }
[BindProperty]
public ContactPhone ContactPhone { get; set; }
//public bool HasPhones => Contact.Phones.Count > 0;
public IActionResult OnGet()
{
PopulatePhoneTypeDropDownList(_context);
int userID = User.Identity.GetUserId<int>();
if (Contact == null)
{
Contact = new Contact();
}
if (ContactPhone == null)
{
Contact = new Contact();
}
Contact.UserId = userID;
ViewData["UserId"] = userID;
return Page();
}
public async Task<IActionResult> OnPostAsync(string submit)
{
int userID = User.Identity.GetUserId<int>();
Contact.UserId = userID;
switch (submit)
{
case "AddPhone":
// (failed attempt) _context.ContactPhone.Add(ContactPhone);
Contact.Phones.Add(new ContactPhone(ContactPhone));
ContactPhone.Number = "";
return Page();
default:
//if (!ModelState.IsValid)
//{
// return Page();
//}
_context.Contact.Add(Contact);
await _context.SaveChangesAsync();
Message = "Contact Created!";
return RedirectToPage("./Index");
}
}
}
}
@page
@model SCPI_Site.Areas.ContactModel.Pages.Contacts.CreateModel
@{
//Layout = "~/Views/Shared/_AdminLayout.cshtml";
ViewData["Title"] = "Create";
}
<div class="col">
<h4>Contact</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="Contact.UserId" />
<div class="row">
<div class="form-group col-md-6">
<label asp-for="Contact.FirstName" class="control-label"></label>
<input asp-for="Contact.FirstName" class="form-control" />
<span asp-validation-for="Contact.FirstName" class="text-danger"></span>
</div>
<div class="form-group col-md-6">
<label asp-for="Contact.LastName" class="control-label"></label>
<input asp-for="Contact.LastName" class="form-control" />
<span asp-validation-for="Contact.LastName" class="text-danger"></span>
</div>
</div>
<div class="form-group">
<label asp-for="Contact.Email" class="control-label"></label>
<input asp-for="Contact.Email" class="form-control" />
<span asp-validation-for="Contact.Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Contact.LocationAddress.Address" class="control-label"></label>
<input asp-for="Contact.LocationAddress.Address" class="form-control" />
<span asp-validation-for="Contact.LocationAddress.Address" class="text-danger"></span>
</div>
<div class="row">
<div class="form-group col-md-4">
<label asp-for="Contact.LocationAddress.City" class="control-label"></label>
<input asp-for="Contact.LocationAddress.City" class="form-control" />
<span asp-validation-for="Contact.LocationAddress.City" class="text-danger"></span>
</div>
<div class="form-group col-md-4">
<label asp-for="Contact.LocationAddress.State" class="control-label"></label>
<input asp-for="Contact.LocationAddress.State" class="form-control" />
<span asp-validation-for="Contact.LocationAddress.State" class="text-danger"></span>
</div>
<div class="form-group col-md-4">
<label asp-for="Contact.LocationAddress.PostalCode" class="control-label"></label>
<input asp-for="Contact.LocationAddress.PostalCode" class="form-control" />
<span asp-validation-for="Contact.LocationAddress.PostalCode" class="text-danger"></span>
</div>
</div>
@if (Model.Contact.Phones != null)
{
<hr />
<table class="table">
<thead>
<tr>
<th>
Type
@*@Html.DisplayNameFor(model => model.Contact.Phones[0].ContactPhoneType)*@
</th>
<th>
Number
@*@Html.DisplayNameFor(model => model.Contact.Phones[0].Number)*@
</th>
<th></th>
</tr>
</thead>
<tbody>
@if (Model.Contact.Phones != null)
{
@foreach (var item in Model.Contact.Phones)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.ContactPhoneType.Id)
</td>
<td>
@Html.DisplayFor(modelItem => item.Number)
</td>
<td>
<a asp-page="../ContactPhones/Edit" asp-route-id="@item.Id">Edit</a> |
<a asp-page="../ContactPhones/Details" asp-route-id="@item.Id">Details</a> |
<a asp-page="../ContactPhones/Delete" asp-route-id="@item.Id">Delete</a>
</td>
</tr>
}
}
</tbody>
</table>
}
<div class="form-group">
<input type="submit" value="Create" class="btn btn-default" />
</div>
<div id="pay-invoice" class="card">
<div class="card-body">
<div class="card-title">
<input type="hidden" id="x_card_num" name="x_card_num" value="">
@*<partial name="../ContactPhones/Index" model=@Model />*@
@*First name:
<input type="text" name="A" value="<%= ViewData[" A"] %>" />
<br />
Last name:
<input type="text" name="B" value="<%= ViewData[" B"] %>" />
<br />
<input type="submit" value="Insert" />
<button type="submit" name="submit" value="add"><span class="glyphicon glyphicon-plus"></span>Add another</button>*@
<input type="hidden" asp-for="ContactPhone.ContactId" />
<div class="row">
<div class="form-group col-md-7">
<label asp-for="ContactPhone.Number" class="control-label"></label>
<input asp-for="ContactPhone.Number" class="form-control" />
<span asp-validation-for="ContactPhone.Number" class="text-danger"></span>
</div>
<div class="form-group col-md-5">
<label asp-for="ContactPhone.ContactPhoneType" class="control-label"></label>
<select asp-for="ContactPhone.ContactPhoneTypeId" class="form-control"
asp-items="@Model.PhoneTypeSL">
@*<option value="">-- Select Type --</option>*@
</select>
<span asp-validation-for="ContactPhone.ContactPhoneTypeId" class="text-danger" />
</div>
</div>
<button type="submit" name="submit" value="AddPhone" class="btn btn-primary"><span class="fa fa-plus"> </span> Add Phone Number</button>
@*<a asp-area="ContactsModel" asp-page="/ContactPhones/Create"> Add Phone Number</a>*@
</div>
</div>
</div>
<p>
@* <a asp-page="Create">Create New</a>*@
</p>
@*@Html.Hidden("Contact.UserId") This breaks the validation*@
@*<div class="form-group">
<label asp-for="Contact.UserId" class="control-label"></label>
<select asp-for="Contact.UserId" class="form-control" asp-items="ViewBag.UserId"></select>
</div>*@
</form>
</div>
</div>
<div>
<a asp-page="Index">Back to List</a>
</div>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
public class Order
{
public int OrderId { get; set; }
public string Customer { get; set; }
public List<OrderItem> Items { get; set; }
}
public class OrderItem
{
public int OrderItemId { get; set; }
public string Item { get; set; }
public decimal Price { get; set; }
}
public class CreateModel : PageModel
{
[BindProperty]
public Order Order { get; set; }
public void OnPost()
{
}
}
@page
@model CreateModel
@{
}
<form method="post">
<input asp-for="Order.Customer" /><br />
<input asp-for="Order.Items[0].Item" /><br/>
<input asp-for="Order.Items[0].Price" />
<input type="submit"/>
</form>
<form method="post">
<input asp-for="Order.Customer" /><br />
@for (var i = 0; i < 5; i++)
{
<input asp-for="Order.Items[i].Item" /><br/>
<input asp-for="Order.Items[i].Price" />
}
<input type="submit"/>
</form>