【发布时间】:2016-02-01 20:54:22
【问题描述】:
我有一个多对一关系的模型:
类股票
public class Stock
{
[Key, Column(Order = 0)]
[DatabaseGenerated(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity)]
public int StockId { get; set; }
[Key, Column(Order = 1)]
[ForeignKey("Description")]
public string Code { get; set; }
public StockDescription Description { get; set; }
[Required]
[DisplayName("# Shares")]
public int NumberOfShares { get; set; }
public void UpdateStock(AddOperationViewModel viewModel)
{
this.NumberOfShares += viewModel.NumberOfShares;
//Get some information from Yahoo!
Controllers.DetailedInfosStocksController controller = new controllers.DetailedInfosStocksController();
Models.DetailedQuoteQueryResultModel infos = controller.RetrieveStockDetailedInfos(this.Code);
FillInfos(infos);
}
public void FillInfos(DetailedQuoteQueryResultModel infos)
{
if(Description == null)
{
Description = new StockDescription();
Description.Code = infos.Symbol;
Description.Name = infos.Name;
}
Description.FillInfos(infos);
}
}
类 StockDescription
public class StockDescription
{
[Key, Column(Order = 1)]
public string Code { get; set; }
[Required]
public string Name { get; set; }
[DisplayFormat(DataFormatString = "{0:F2}")]
[DisplayName("Price")]
public double LastPrice { get; set; }
[DisplayFormat(DataFormatString = "{0:P2}")]
[DisplayName("Variation")]
public double ChangePercent { get; set; }
public void FillInfos(DetailedQuoteQueryResultModel infos)
{
LastPrice = double.Parse(infos.LastTradePriceOnly);
ChangePercent = double.Parse(infos.ChangeinPercent.Replace("%", "")) / 100;
}
}
我正在尝试按如下方式更新股票条目:
// POST: AddOperation
[HttpPost]
public ActionResult AddOperation(AddOperationViewModel viewModel)
{
if(ModelState.IsValid)
{
var existingStock = db.Stocks.Where(s => s.Code == viewModel.Code).FirstOrDefault<Stock>();
if(existingStock == null)
{
Stock stock = new Stock(viewModel);
db.Stocks.Add(stock);
}
else
{
existingStock.UpdateStock(viewModel);
db.Entry(existingStock).State = EntityState.Modified;
}
db.SaveChanges();
return PartialView("StockListPartialView", db.Stocks.Include("Description").ToList());
}
}
这个例外:
发生了参照完整性约束违规:属性 定义引用约束的值不一致 关系中的主体对象和依赖对象之间的关系。
在我设置要修改的条目状态时发生。到目前为止我发现的解决方法是设置existingStock.Description = null,但描述不再更新。
【问题讨论】:
-
您使用哪个属性将
StockDescription与Stock关联起来?只有Description在Stock上,还是在StockDescription中的某个地方有StockId属性? -
UpdateStock 是做什么的?它是否正确设置了 FK?
-
StockDescription 和 Stock 与
Code属性相关。并且示例代码中给出了 UpdateStock,不,它不会更改 FK。 -
如果它们是通过
Code关联的,那么这个属性似乎与Stock和它的StockDescription不同。 -
这是我想的,但调试器告诉我相反,它们实际上是相同的(不是相同的实例,而是相同的值)
标签: c# asp.net entity-framework