English 中文(简体)
无法更新实体名称,因为实体名称有“定义”,没有“更新”内容。
原标题:Unable to update the EntitySet - because it has a DefiningQuery and no <UpdateFunction> element exist

我使用了实体框架1和3.5。

我正在做这样的事情:

var roomDetails = context.Rooms.ToList();

foreach (var room in roomDetails)
{        
   room.LastUpdated = DateTime.Now;
}

我在努力做到:

 context.SaveChanges();

我发现错误:

www.un.org/Depts/DGACM/index_spanish.htm 无法更新实体名称,因为实体名称有“质量”和“无”的定义; 最新功能和功能; 功能设计中包含的内容; 功能设计;支持目前运作的要素。

我做了大量更新,没有问题,只是在我试图更新这一特定实体的时候。

我的所有搜索都显示同样的情况,在我试图更新的实体中,没有主要的关键。 但是,我确实有一条主要关键声明......

最佳回答

其原因通常如下:

  • Entity Set is mapped from Database view
  • A custom Database query
  • Database table doesn t have a primary key

在这样做之后,你可能仍然需要在实体框架设计员(或替代删除实体,然后添加)中更新,以免出现错误。

问题回答

正义 表中增加一个主要关键因素。 这就是说。 问题已经解决。

ALTER TABLE <TABLE_NAME>
ADD CONSTRAINT <CONSTRAINT_NAME> PRIMARY KEY(<COLUMN_NAME>)

我就是这样。 简单删除造成另一个错误。 除最后一项措施外,我还采取了这一职位的步骤。 为了方便起见,我从我处理该问题的那个员额中抄录了4个步骤:

  1. Right click on the edmx file, select Open with, XML editor
  2. Locate the entity in the edmx:StorageModels element
  3. Remove the DefiningQuery entirely
  4. Rename the store:Schema="dbo" to Schema="dbo" (otherwise, the code will generate an error saying the name is invalid)

仅请注意:Entity have main key ,但your table in database doesn t have main key

<><>UPDATE: 我最近只字不提几个字句,因此,我看上去,让人们知道我下面提供的建议是最好的。 自2006年以来 最初,我开始忙于在旧的无关键数据库上制定实体框架,我已认识到,卢旺达武装部队所能做的最出色工作是扭转代码第一。 在如何做到这一点方面,有一些很好的文章。 就在后面,然后,当你想增加关键内容时,将数据说明用于“伪造”钥匙。

例如,我要说的是,我知道我的表格<编码>Orders,虽然它没有主要钥匙,但只保证每个客户有一个订单号码。 由于这些是表上头两栏,我设立了第一栏,以研究:

    [Key, Column(Order = 0)]
    public Int32? OrderNumber { get; set; }

    [Key, Column(Order = 1)]
    public String Customer { get; set; }

By doing this, you re basically faked EF into believing that there s a clustered key composed of OrderNumber and Customer. This will allow you to do inserts, updates, etc on your keyless table.

如果你不熟悉《实体框架法》第一版,就开始并找到一部关于实体框架法典的良好指导。 然后,就《反向法第一》(该法首先使用现有的数据库)。 之后,我刚刚回过来,再次审视我的主要建议。

www.un.org/Depts/DGACM/index_spanish.htm

首先,正如其他人所说的那样,最好的选择是增加表格的主要关键内容。 完全停止。 如果你能够这样做,就不再做。

但是,如果你能够 t,或只是仇恨,那么,没有主要钥匙,就能够这样做。

在我的案件中,我正与遗产制度合作(最初是一份安达400号船的固定档案,然后运到T-SQL)。 因此,我不得不找到办法。 这是我的解决办法。 以下是我使用实体框架6.0(最新版本的这份著作)。

  1. Right-click on your .edmx file in the Solution Explorer. Choose "Open With..." and then select "XML (Text) Editor". We re going to be hand-editing the auto-generated code here.

  2. Look for a line like this:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">

  3. Remove store:Name=“table_name” from the end.

  4. Change store:Schema="whatever" to Schema="whatever"

  5. Look below that line and find the <DefiningQuery> tag. It will have a big ol select statement in it. Remove the tag and it s contents.

  6. Now your line should look something like this:
    <EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />

  7. We have something else to change. Go through your file and find this:
    <EntityType Name="table_name">

  8. 几乎你可能看到一些评论的文本警告你,它没有确定主要的关键,因此,关键是推算的,定义只是读表/概览。 您可以离开或删除。 我删除了这一句。

  9. Below is the <Key> tag. This is what Entity Framework is going to use to do insert/update/deletes. SO MAKE SURE YOU DO THIS RIGHT. The property (or properties) in that tag need to indicate a uniquely identifiable row. For instance, let s say I know my table orders, while it doesn t have a primary key, is assured to only ever have one order number per customer.

So mine looks like:

<EntityType Name="table_name">
              <Key>
                <PropertyRef Name="order_numbers" />
                <PropertyRef Name="customer_name" />
              </Key>

很严重,没有这样做。 让我们说,即使永远不会发生重复,但只有两行才能进入我的系统,其编号和客户名称相同。 Who! 那是我不使用钥匙的。 因此,我利用实体框架删除。 由于我知道重复是今天的唯一命令,我这样做:

var duplicateOrder = myModel.orders.First(x => x.order_date == DateTime.Today);
myModel.orders.Remove(duplicateOrder);

Guess what? I just deleted both the duplicate AND the original! That s because I told Entity Framework that order_number/cutomer_name was my primary key. So when I told it to remove duplicateOrder, what it did in the background was something like:

DELETE FROM orders
WHERE order_number = (duplicateOrder s order number)
AND customer_name = (duplicateOrder s customer name)

And with that warning... you should now be good to go!

This can also happen if data model is out of date.

希望这将拯救其他人的失望情绪:

如果您的表格没有主要的关键,本表“只读”和<代码>db,就可能出现错误。 SaveChanges(的指挥总是有误。

I was getting the same error message, but in my scenario I was trying to update entities derived from a many-to-many relationship using a PJT (Pure Join Table).

从阅读其他员额来看,我认为我可以通过在合并表格中增加一个PK领域来加以固定。 然而,如果在表格中增加一个PK栏,它不再是PJT,你就失去了实体框架的所有优势,如实体之间的自动关系制图。

因此,我的案件解决办法是改变亚洲开发银行的合并表格,以建立一个包括外国身份证栏的PK。

小学 之后,关键人物可免去表格,然后再回到模型。 页: 1

s it real, Just Add a main key

说明:如果你从你再次提到<>right>/strong>数据库的数据库中更新你的EF图,那么,如果你相信你会增加主要钥匙,而且你仍然重犯同样的错误,那么我就希望张贴这一图。

“entergraph

In my case, forgot to define Primary Key to Table. So assign like shown in Picture and Refresh your table from "Update model from Database" from .edmx file. Hope it will help !!!

我也有同样的问题。 正如这番话已经说过的那样,我的表格中确实有PK,因此,我建立了PK并操作了该守则。 但不幸的是,错误再次出现。 接下来,我做了些什么,删除了亚洲开发银行的连接(在“解决方案探索者示范文件夹中编成的双倍x文件),并重新予以了。 过了。 感谢大家分享经验。 它节省了许多时间。

这不是新的答案,而是帮助某些人,他们不敢确定如何为其桌子确定主要关键。 在新的询问和操作中使用。 这将将统一数据库一栏列为主要关键。

USE [YourDatabaseName]
GO

Alter table  [dbo].[YourTableNname]
Add Constraint PK_YourTableName_UniqueID Primary Key Clustered (UniqueID);
GO

我正在研究这一问题,因为我正在从现有数据库(由其他人设计)中生成我的EDMX,而且我在此使用这一术语。

表中没有任何关键因素。 EF正在以多种钥匙形成模型。 我不得不在文件表中增加一个主要关键因素,然后在文件S中更新我的模型。

这对我来说是固定的。

Adding the primary key worked for me too !

Once that is done, here s how to update the data model without deleting it -

Right click on the edmx Entity designer page and Update Model from Database .

I had the exact same problem, unfortunately, adding the primary key doesn t solve the issue. So here s how I solve mine:

  1. Make sure you have a primary key on the table so I alter my table and add a primary key.
  2. Delete the ADO.NET Entity Data Model (edmx file) where I use to map and connect with my database.
  3. Add again a new file of ADO.NET Entity Data Model to connect with my database and for mapping my model properties.
  4. Clean and rebuild the solution.

问题已经解决。

仅增加贵会议桌上的主要关键内容,然后重新计算一下您的欧安会。

I just had to remove the table from the model and update the model again bringing the table back. I guess the primary key was created after the table was pulled into the model.

我曾提出过这个问题,认为之所以出现这一问题,是因为我删除了表格中的主要关键内容,并以表格中某些其他领域的指数取而代之。

After I deleted the primary key index and refreshed the edmx, inserts stopped working.

我向旧版本复述了这一表格,恢复了ed,一切照旧。

我应该指出,当我打开了EDMX以解决这个问题,检查是否确定了主要的关键定义时,就会出现这种情况。 因此,上述任何建议都没有帮助我。 但是,更新关于主要关键因素的指数似乎正在发挥作用。

在XML编辑中公开你的编辑,然后将标签从Tag中删除,并将:Schema=“dbo”改为Schema=“dbo”,并重建现在的解决错误将得到解决,你将能够节省数据。

I found the original answer of updating the .edmx file work best in my situation. I just wasn t too happy about altering the model every time it was updated from the database. That s why I wrote an additional Text Template file, that is automaticaly invoked when after the model has changed - just like the entities are newly generated. I post it here in this comment. To make it work, make sure you name it like {model name}.something.tt, and store it in the same folder as your .edmx folder. I named it {model name}.NonPkTables.tt. It does not generate a file on its own due to the invalid file extension definition in the second line. Feel free to use.

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ output extension="/" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Data" #>
<#@ assembly name="System.Windows.Forms" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq"#>
<#@ assembly name="%VS120COMNTOOLS%..IDEEntityFramework.dll" #>
<#@ assembly name="%VS120COMNTOOLS%..IDEMicrosoft.Data.Entity.Design.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Windows.Forms" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.Globalization" #>
<#@ import namespace="System.Reflection" #>
<#@ import namespace="System.Data.Entity.Core.Metadata.Edm" #>
<#@ import namespace="System.Data.Entity.Core.Mapping" #>
<#@ import namespace="System.CodeDom" #>
<#@ import namespace="System.CodeDom.Compiler" #>
<#@ import namespace="Microsoft.CSharp"#>
<#@ import namespace="System.Text"#>
<#@ import namespace="System.Diagnostics" #>

<#
    string modelFileName= this.Host.TemplateFile.Split( . )[0] + ".edmx";
    string edmxPath = this.Host.ResolvePath( modelFileName );

    // MessageBox.Show( this.Host.TemplateFile + " applied." );
    var modelDoc = XDocument.Load(edmxPath);
    var root = modelDoc.Root;
    XNamespace nsEdmx = @"http://schemas.microsoft.com/ado/2009/11/edmx";
    XNamespace ns = @"http://schemas.microsoft.com/ado/2009/11/edm/ssdl";

    var runtime = root.Elements(nsEdmx + "Runtime").First();
    var storageModels = runtime.Elements(nsEdmx + "StorageModels").First();
    XNamespace nsStore = @"http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator";

    var schema = storageModels.Elements(ns + "Schema").First();
    XNamespace nsCustomAnnotation = @"http://schemas.microsoft.com/ado/2013/11/edm/customannotation";

    var entityTypes = schema.Nodes().OfType<XComment>().Where(c => c.Value.Contains("warning 6002: The table/view"));
    bool changed = false;

    foreach (var node in entityTypes)
    {
        var element = node.ElementsAfterSelf().First();
        string entityName = element.Attribute("Name").Value;

        // Find EntitySet in EntityContainer.
        var entityContainer = schema.Elements(ns + "EntityContainer").First();
        var entitySet = entityContainer.Elements(ns + "EntitySet").First(s => s.Attribute("Name").Value == entityName);

        // Change "store:Schema" attribute to "Schema" attribute.
        var attribute = entitySet.Attribute(nsStore + "Schema");

        if (attribute != null)
        {
            string schemaName = entitySet.Attribute(nsStore + "Schema").Value;
            entitySet.Attribute(nsStore + "Schema").Remove();
            entitySet.Add(new XAttribute("Schema", schemaName));
            changed |= true;
        }

        // Remove the DefiningQuery element.
        var definingQuery = entitySet.Element(ns + "DefiningQuery");

        if (definingQuery != null)
        {
            definingQuery.Remove();
            changed |= true;        
            Debug.WriteLine(string.Format("Removed defining query of EntitySet {0}.", entityName));
        }
    }

    if (changed)
        modelDoc.Save(edmxPath);
#>

I fixed it by just deleting and rebuilding the EF project and all its classes. See details below:

我进行了一个小时的回合,然后删除了包含这一错误的欧洲复兴开发银行项目,删除了我的所有习惯代码,然后整整件。 由于这只是产生新的EF图表和内部编码的问题,解决这一问题的进程大约需要10分钟。

我怀疑,问题是,在两个或三个“更新日期”之后,产生EF级和特性的数据库第一方法几乎得不到重视。 基本上,我发现法典行为存在问题,进入并固定了数据库表的特性,然后又一次更新了EF图。 然后,我试图绕过该守则,而该守则是徒劳的。

从工作开始。





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Transaction handling with TransactionScope

I am implementing Transaction using TransactionScope with the help this MSDN article http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx I just want to confirm that is ...

System.Web.Mvc.Controller Initialize

i have the following base controller... public class BaseController : Controller { protected override void Initialize(System.Web.Routing.RequestContext requestContext) { if (...

Microsoft.Contracts namespace

For what it is necessary Microsoft.Contracts namespace in asp.net? I mean, in what cases I could write using Microsoft.Contracts;?

Separator line in ASP.NET

I d like to add a simple separator line in an aspx web form. Does anyone know how? It sounds easy enough, but still I can t manage to find how to do it.. 10x!