我有两个表,Property和PropertyMeta。它们由PropertyID值链接。我刚开始使用ASP.net MVC,目前正在使用MVC2(由于托管服务提供商的限制)。从一个简单的创建页面,我试图填充两个表,但我根本没有运气。
[HttpPost, Authorize]
public ActionResult Create(PropertyViewModel property)
{
try
{
MyEntities db = new MyEntities();
Property _property = new Property();
_property = property.Properties;
PropertyMeta _meta = new PropertyMeta();
_meta.Property = _property;
_meta = property.Meta;
db.AddToProperties(_property);
db.AddToPropertyMetas(_meta);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我已经尝试过以上但是没有用。这很烦人,这应该是如此简单,但我被卡住了。谁能想到以上可能出现的问题呢?任何帮助将不胜感激!
答案 0 :(得分:1)
类型为PropertyViewModel.Properties
的{{1}}?我猜测问题出现在这两行代码中,因为创建新的Property
并立即为其分配Property
似乎没有意义。
property.Properties
答案 1 :(得分:0)
你正在覆盖你的价值。
_meta.Property = _property; //sets an individual property
_meta = property.Meta; //Overwrites all properties
反转这些行,这样你就可以写下所有的值,然后再设置一个值。
_meta = property.Meta; //Overwrites all properties
_meta.Property = _property; //sets an individual property
阅读完评论后,我意识到你要做的事情。您的财产在输入数据库之前没有ID。如果您在调试器中单步执行此操作,则可以看到此信息。要解决此问题,请首先提交该属性,然后再将其应用于元数据。
MyEntities db = new MyEntities();
Property _property = property.Properties;
db.AddToProperties(_property);
db.SaveChanges();
此时,如果您查看调试器,则_properties ID值现在将设置为数据库指定的值。现在当你将meta绑定到属性时,它将是一个带有键的实际属性项,因此它将知道如何将它与数据库关联。
PropertyMeta _meta = property.Meta;
_meta.Property = _property;
db.AddToPropertyMetas(_meta);
db.SaveChanges();
答案 2 :(得分:0)
你的问题不是实体框架太复杂,你似乎很难掌握C#的工作原理,因为你正在创建新变量并立即用不同类型的值覆盖它们(甚至不确定如何编译)。
你有几个问题:
Property _property = new Property();
_property = property.Properties;
这会创建一个新的_property。然后在刚刚创建的属性上分配一个新属性。您不应该在viewmodel中使用域模型对象,但这不是您的问题。
你可以这样做:
Property _property = property.Properties;
接下来,您遇到了这个问题:
PropertyMeta _meta = new PropertyMeta();
_meta.Property = _property;
_meta = property.Meta; // overwrites the value assigned above
同样,你要覆盖刚刚创建的对象。所以这是公平的:
PropertyMeta _meta = property.Meta;
_meta.Property = _property;
最后,这是最后一点:
db.PropertyMetas.Add(_meta);
db.SaveChanges();
EF会自动将属性添加到表中,因为它已在_meta.Property表中链接,因此您不会明确添加它。