【问题标题】:Entity Framework & MVC - Insert into multiple table using foreign keysEntity Framework & MVC - 使用外键插入多个表
【发布时间】:2011-09-12 22:09:19
【问题描述】:

我有两个表,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();
        }
    }

我已经尝试了上述方法,但它不起作用。这很烦人,这应该很简单,但我被卡住了。谁能想到上面可能有什么问题?任何帮助将不胜感激!

【问题讨论】:

  • 是不是保存了错误的数据?还是抛出异常?
  • 它根本不保存任何数据并给出“没有为此对象定义无参数构造函数。”
  • 仅供参考,标准做法是仅将_用于私有成员变量,而不用于局部变量。另外,当你说你不能使用 MVC 3 时,这是为什么呢?您不必让您的托管服务提供商安装 MVC,您可以进行 bin 部署。你不能这样做的唯一原因是他们没有安装 .net 4。

标签: c# entity-framework asp.net-mvc-2


【解决方案1】:

PropertyViewModel.PropertiesProperty 类型吗?我猜问题出在这两行代码中,因为创建一个新的Property 并立即将property.Properties 分配给它似乎没有意义。

Property _property = new Property();
_property = property.Properties;

【讨论】:

  • 是的,我应该更清楚地说明这一点。我创建了一个包含属性和属性元类型的视图模型。因此,如果我分配property.Properties,那是否不会从创建页面中获取属性字段并用它们填充_property 变量?感谢您的帮助。
【解决方案2】:

你正在覆盖你的价值。

_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 值现在将设置为数据库分配的值。现在,当您将元数据绑定到属性时,它将是一个带有键的实际属性项,因此它将知道如何在数据库中关联它。

        PropertyMeta _meta = property.Meta;
        _meta.Property = _property;            
        db.AddToPropertyMetas(_meta);
        db.SaveChanges();

【讨论】:

  • 感谢您的建议,但它仍然无法正常工作。在实体模型中,它的外键值为_property.PropertyMeta_meta.Property(如果这没有意义,请道歉)。我的印象是我需要在创建语句期间将一个设置为另一个,以便使用相同的 PropertyID 创建两条记录。
  • 很抱歉,我不太明白您在尝试什么。您正在创建一个新属性和一个新元,但还没有创建 ID,因为我采用的 ID 是由数据库自动生成的。我会修改我的答案。您需要先创建属性,然后创建元数据,以便外键具有实际值。
【解决方案3】:

您的问题不在于 Entity Framework 太复杂,您似乎对 C# 的一般工作方式了解不足,因为您正在创建新变量并立即用不同类型的值覆盖它们(甚至不确定如何编译)。

你有几个问题:

Property _property = new Property(); 
_property = property.Properties; 

这会创建一个新的 _property。然后在刚刚创建的属性上分配一个新属性。您不应该在视图模型中使用域模型对象,但这不是您的问题。

你可以这样做:

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 表中,因此您无需显式添加它。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多