【问题标题】:Update EF model from database is causing Multiplicity errors on an existing project working perfectly从数据库更新 EF 模型导致现有项目完美运行的多重性错误
【发布时间】:2014-02-12 19:37:04
【问题描述】:

我继承了一个项目(ASP.NET Web 窗体)来更新/升级。当我运行调试时,该项目在 VS 2013 中运行良好,但是当我将表添加到 SQL DB 并且“从数据库更新模型”时,EF (4.0) 返回一堆错误,例如:

错误 34 错误 113:多重性在关系“FK_FinanceInvoice_Events”中的角色“事件”中无效。因为 Dependent Role 中的所有属性都可以为空,所以 Principal Role 的复数必须为 '0..1'。

在我修复这些错误之前,它不会将表格添加到我的模型中,但是如果我更改 Multiplicity 设置(正如一些帖子建议的那样),就会出现多个其他错误。

问题是系统和 EF 模型完美运行,直到我尝试更新它。

我也尝试先创建模型和“生成数据库”,但这会删除整个数据库,我不能这样做,因为它有很多数据。

我注意到的一件事是 Model.edmx 没有 .tt 和 context.tt 文件(我想发布我的解决方案资源管理器的图片,但我没有足够的声望点)。我的模型中缺少这两个文件是否有原因?

第二个问题是我需要更新的数据库正在生产中,并且充满了现有数据。

如果有人能指出正确的方向,我将不胜感激。 谢谢!

编辑: Jim Wooley 建议我们的 DataModel 可能是在 T4 之前创建的,我没有足够的知识来找出它。这是附加到.edmx 的designer.cs 文件的内容。希望有人能告诉我它是如何创建的以及如何更新/修改数据库和模型

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.ComponentModel;
using System.Data.EntityClient;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Linq;
using System.Runtime.Serialization;
using System.Xml.Serialization;

[assembly: EdmSchemaAttribute()]
#region EDM Relationship Metadata

[assembly: EdmRelationshipAttribute("EMSDataModel", "FK_ActivityLogs_Log", "UserLog", System.Data.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(EMS.Data.UserLog), "ActivityLog", System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(EMS.Data.ActivityLog), true)]

//The rest i removed for brevity

namespace EMS.Data
{
    #region Contexts

    /// <summary>
    /// No Metadata Documentation available.
    /// </summary>
    public partial class EMSDataModelContainer : ObjectContext

    //The rest i removed for brevity

    #region Entities

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmEntityTypeAttribute(NamespaceName="EMSDataModel", Name="AccommodationDetail")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AccommodationDetail : EntityObject

    //The rest i removed for brevity

    #region ComplexTypes

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmComplexTypeAttribute(NamespaceName="EMSDataModel", Name="CheckCityExists_Result")]
[DataContractAttribute(IsReference=true)]
[Serializable()]
public partial class CheckCityExists_Result : ComplexObject
    //The rest i removed for brevity

}

我希望有人可以将我重定向到对生产数据库和模型进行更改。

编辑:我正在使用 Visual Studio 2013,这篇文章对我不起作用How to Use Entity Framework 4 with Visual Studio 2013

【问题讨论】:

  • 不知道,也许尝试创建新的解决方案,从头开始创建新模型
  • 这意味着如果某些模型属性发生更改,则更新大量代码
  • 听起来创建模型的人要么手动调整它,要么在数据库中更改数据模式之前完成它。如果模型首先与数据库中的模式不一致,EF 可以正常工作,但是从数据库重新生成会导致模型被更新。之前添加的定制可能需要根据新模式进行更新。如果您解决了这些问题,您应该能够手动对模型进行适当的更改并保留您的数据库和应用程序代码而无需更改。
  • 既然你说 .tt 文件不存在,我想知道你是否在 T4 集成公开之前使用的是早期版本的 EF。
  • 有可能。检测到的 EF 版本是 4.0。如果是这种情况,我应该如何进行?

标签: c# asp.net sql entity-framework


【解决方案1】:

使用VS 2010解决了所有这些问题。我在VS 2010中导入了项目,从数据库更新了模型,成功导入了新表。没有产生任何错误,我们都很高兴。 太糟糕了,我不能使用我花钱在这个项目上工作的新 VS 2013 Pro。我希望新的 VS 版本能够检测到旧项目并适应或至少提醒用户潜在问题

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2023-01-30
    • 2013-04-23
    • 2023-03-08
    相关资源
    最近更新 更多