Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >实体框架在添加没有ID的数据时抛出错误

实体框架在添加没有ID的数据时抛出错误
EN

Stack Overflow用户
提问于 2017-08-16 01:03:05
回答 3查看 282关注 0票数 1

我有一个函数,它返回一个tweet列表。列表中的每个元素都有大量的数据,tweet的文本、位置、用户信息(如果是转发)、它的时间、转发信息、图片链接,以及更多的数据,相互之间的数据列表。

我使用的是Linq2Twitter包,它为我提供了一个名为Status的对象,这就是我所指的Tweet。

这段代码从我的函数:var container = await DoPagedSearchAsync(context, this);中获取数据

我的DBSet看起来是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       public class TweetContext : DbContext
    {
        public DbSet<Status> Tweets { get; set; }
    }

我试图用以下代码添加数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        using (var vontex = new TweetContext())
        {
            vontex.Tweets.AddRange(container);
            vontex.SaveChanges();
        }

下面是我在运行时在行中得到的错误列表:vontex.Tweets.AddRange(container);

在模型生成过程中检测到一个或多个验证错误: DataAcquirer.Models.Status::EntityType 'Status‘没有定义键。定义此EntityType的键。DataAcquirer.Models.Coordinate::EntityType‘坐标’没有定义键。定义此EntityType的键。DataAcquirer.Models.Entities::EntityType‘实体’没有定义密钥。>定义此EntityType的键。DataAcquirer.Models.HashTagEntity::EntityType 'HashTagEntity‘没有定义键。定义此EntityType的键。DataAcquirer.Models.PhotoSize::EntityType 'PhotoSize‘没有定义键。定义此EntityType的键。DataAcquirer.Models.VideoInfo::EntityType 'VideoInfo‘没有定义键。定义此EntityType的键。DataAcquirer.Models.Variant::EntityType 'Variant‘没有定义键。定义此EntityType的键。DataAcquirer.Models.SymbolEntity::EntityType 'SymbolEntity‘没有定义键。定义此EntityType的键。DataAcquirer.Models.UrlEntity::EntityType 'UrlEntity‘没有定义键。定义此EntityType的键。DataAcquirer.Models.UserMentionEntity::EntityType 'UserMentionEntity‘没有定义键。定义此EntityType的键。DataAcquirer.Models.Geometry::EntityType‘几何学’没有定义键。定义此EntityType的键。DataAcquirer.Models.User::EntityType 'User‘没有定义密钥。定义此EntityType的键。DataAcquirer.Models.BannerSize::EntityType 'BannerSize‘没有定义键。定义此EntityType的键。DataAcquirer.Models.Category::EntityType‘EntityType’类别没有定义键。定义此EntityType的键。推特: EntityType: EntitySet 'Tweets‘是基于没有定义键的“状态”类型的。坐标: EntityType: EntitySet‘坐标’基于没有定义键的“坐标”类型。实体: EntityType: EntitySet‘实体’是基于没有定义键的“实体”类型的。HashTagEntities: EntityType: EntitySet 'HashTagEntities‘是基于没有定义键的'HashTagEntity’类型的。PhotoSizes: EntityType: EntitySet 'PhotoSizes‘是基于没有定义键的'PhotoSize’类型的。VideoInfoes: EntityType: EntitySet 'VideoInfoes‘是基于没有定义键的'VideoInfo’类型的。变体: EntityType: EntitySet 'Variants‘是基于没有定义键的类型’Variants‘。SymbolEntities: EntityType: EntitySet 'SymbolEntities‘是基于没有定义键的'SymbolEntity’类型的。UrlEntities: EntityType: EntitySet 'UrlEntities‘是基于没有定义键的'UrlEntity’类型的。UserMentionEntities: EntityType: EntitySet 'UserMentionEntities‘是基于没有定义键的'UserMentionEntity’类型的。几何: EntityType: EntitySet‘几何学’是基于没有定义键的类型‘几何学’。EntityType: EntitySet 'User‘是基于没有定义键的’User‘类型的。BannerSizes: EntityType: EntitySet 'BannerSizes‘是基于没有定义键的'BannerSize’类型的。类别: EntityType: EntitySet‘类别’是基于没有定义键的“类别”类型。

该课程如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using LitJson;

namespace LinqToTwitter
{
 [XmlType(Namespace = "LinqToTwitter")]
 public class Status
 {
    public Status();
    public Status(JsonData status);

    public Annotation Annotation { get; set; }
    public List<Contributor> Contributors { get; set; }
    public Coordinate Coordinates { get; set; }
    public int Count { get; set; }
    public DateTime CreatedAt { get; set; }
    public ulong CurrentUserRetweet { get; set; }
    public long Cursor { get; set; }
    public Cursors CursorMovement { get; set; }
    public EmbeddedStatus EmbeddedStatus { get; set; }
    public Entities Entities { get; set; }
    public bool ExcludeReplies { get; set; }
    public Entities ExtendedEntities { get; set; }
    public int? FavoriteCount { get; set; }
    public bool Favorited { get; set; }
    public FilterLevel FilterLevel { get; set; }
    public ulong ID { get; set; }
    public bool IncludeContributorDetails { get; set; }
    public bool IncludeEntities { get; set; }
    public bool IncludeMyRetweet { get; set; }
    public bool IncludeRetweets { get; set; }
    public bool IncludeUserEntities { get; set; }
    public string InReplyToScreenName { get; set; }
    public ulong InReplyToStatusID { get; set; }
    public ulong InReplyToUserID { get; set; }
    public string Lang { get; set; }
    public bool Map { get; set; }
    public ulong MaxID { get; set; }
    public StatusMetaData MetaData { get; set; }
    public EmbeddedStatusAlignment OEmbedAlign { get; set; }
    public bool OEmbedHideMedia { get; set; }
    public bool OEmbedHideThread { get; set; }
    public string OEmbedLanguage { get; set; }
    public int OEmbedMaxWidth { get; set; }
    public bool OEmbedOmitScript { get; set; }
    public string OEmbedRelated { get; set; }
    public string OEmbedUrl { get; set; }
    public Place Place { get; set; }
    public bool PossiblySensitive { get; set; }
    public Status QuotedStatus { get; set; }
    public ulong QuotedStatusID { get; set; }
    public int RetweetCount { get; set; }
    public bool Retweeted { get; set; }
    public Status RetweetedStatus { get; set; }
    [XmlIgnore]
    public Dictionary<string, string> Scopes { get; set; }
    public string ScreenName { get; set; }
    public ulong SinceID { get; set; }
    public string Source { get; set; }
    public ulong StatusID { get; set; }
    public string Text { get; set; }
    public bool TrimUser { get; set; }
    public bool Truncated { get; set; }
    public string TweetIDs { get; set; }
    [XmlIgnore]
    public StatusType Type { get; set; }
    public User User { get; set; }
    public ulong UserID { get; set; }
    public List<ulong> Users { get; set; }
    public bool WithheldCopyright { get; set; }
    public List<string> WithheldInCountries { get; set; }
    public string WithheldScope { get; set; }
 }
}

以上模型不能编辑。它附带了Linq2Twitter包。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 09:22:10

这种方法行不通。Twitter返回分层而非关系的对象。下面是使用的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "retweeted":false,
  "in_reply_to_screen_name":null,
  "possibly_sensitive":false,
  "retweeted_status":{
     "retweeted":false,
     ...,
     "user":{
        "id":41754227,
        ...
     },
     ...
  },
  "contributors":null,
  "coordinates":{
      "type":"Point",
      "coordinates":[
          -122.40060,
          37.78215
      ]
  },
  "place":null,
  "user":{
     "id":15411837,
     ...
  },
  "retweet_count":393,
  ...
}

LinqtoTwitter将其转换为Tweet类型,而Tweet类型有几个习惯用法,使构建LINQ where子句更加容易。Tweet仍然是分层的。

要理解Tweet的层次结构,请注意上面的JSON在Tweet下有更复杂的对象,例如retweeted_status ( LINQ中的RetweetedStatus),它是TweetTweet类型属性,userTweetUser类型属性。在RetweetedStatusUser中是更复杂的对象。

对于您所看到的问题,请注意coordinates属性。它没有ID,因为它主要是一个值。也许它会更好地被建模为一个结构,因为它的语义,也许这是我的其中之一,在这里,但事实是,它没有,也永远不会,有一个ID。如果您查看错误消息中的项列表,您将看到大多数错误都是针对像coordinates这样的值类型对象的。

一种方法是不要在关系模型中持久化,而是寻找一个满足您需要的NoSQL选项。比如MongoDB或微软的新CosmosDB --还有无数的选择。我在自己的代码中采用了这种方法,因为虽然Twitter最近变得更加规范,但它过去常常会发生不可预测的变化。尽管如此,如今一种关系式的方法可能是可行的。在这种方法中,您可以像下面这样从Twitter读取原始内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
string jsonResults = vontex.RawResults;

然后,您可以使用Json.NET提取单独的tweet。

下面是我将使用关系方法所做的工作:

  1. 使用自动机。学习这个工具所需的时间不多,不仅在这个项目上,而且在将来也会有很多好处。
  2. 创建适合关系持久性的自己的Tweet对象。
  3. 使用关系引用将被转发的状态引用回原始的tweet。
  4. 创建一个用户表,并创建一个从TweetUser的引用。
  5. 对于所有的值类型对象,您有两个选项: a.如果它是单个值,如coordinates,则将其压缩到Tweet中。如果它是一个多值的,比如entities,那么创建一个单独的表,其中实体有它自己的伪键,并引用到Tweet

我知道你想看代码。然而,这是一项巨大的工作,编写代码将与我为您编写整个数据访问层相媲美,这对于论坛的回答来说是不合理的。除非需要进行关系处理,否则我仍然会选择NoSQL路径。希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2017-08-16 01:30:38

如果计划手动创建if,可以从状态继承并添加类似的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [DatabaseGe‌​nerated(DatabaseGen‌​eratedOption.None)]
 public Guid Id { get; set; }

或者使用注释中的键属性(http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Key]
 public Guid Id { get; set; }

希望能帮上忙。

票数 0
EN

Stack Overflow用户

发布于 2017-08-16 02:30:24

你看过System.Data.Entity.ModelConfiguration.EntityTypeConfiguration

您可以创建一个地图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class StatusMap : EntityTypeConfiguration<Status>
{
     public StatusMap()
     {
         ToTable("StatusTable")
         .HasKey(p => p.ID);
     }
}

然后,在您的上下文中添加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected override void OnModelCreating([NotNull] DbModelBuilder modelBuilder)
{
     modelBuilder.Configurations.Add(new StatusMap());
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45709321

复制
相关文章
fastadmin 下拉框(添加关联表id)
1 add.html<div class="form-group"> <label class="control-label col-xs-12 col-sm-2">{:__('Cate_id')}:</label> <div class="col-xs-12 col-sm-8"> <input id="c-cate_id" data-rule="required" data-source="test/cate/index" data-primary-key="cate_id" d
正经人
2022/12/14
1.9K0
【JAVA调错】----JBoss发布多个项目时抛出webAppRootKey错误
进行如上配置后,修改log4j.xml后,在刷新间隔时间后,配置的监听器Log4jConfigListener会重新加载log4j相关配置。
令仔很忙
2018/09/14
1.1K0
Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法
Linq to Sql中,如果我们想在DataContext外部修改一个实体的值,然后把引用传入到DataContext中,再利用Attach附加后更新,代码如下: public static void UpdateMyTable(myData _pDate) { using (dbUserDataContext db = new dbUserDataContext(Website.ConnStrdbUser))     { try     {         db.myData.Attach(_pDa
菩提树下的杨过
2018/01/23
1.9K0
C++核心准则​讨论:持有没有被句柄管理的资源时切勿抛出异常
Discussion: Never throw while holding a resource not owned by a handle
面向对象思考
2020/12/31
6810
Hadoop搭建,上传文件时出现错误,没有到主机的路由
解决方案: (1)从namenode主机ping其它slaves节点的主机名(注意是slaves节点的主机名),如果ping不通,原因可能是namenode节点的/etc/hosts 未配置主机名与IP地址的映射关系,补全主机名与IP地址的映射关系。 (2)从datanode主机ping master节点的主机名(注意也是节点的主机名),如果ping不通,原因可能是datenode节点的/etc/hosts 未配置主机名与IP地址的映射关系,补全主机名与IP地址的映射关系。 (3)查看各机器节点的防火墙是否关闭(或者设置防火墙开启,但对我们的指定端口开放,最好是关闭防火墙)
hankleo
2020/09/17
2.6K0
使用java(jdbc)向mysql中添加数据时出现“unknown column……”错误
这里的date变量其实我是用SimpleDate类设置的是一个字符串类型的数据了,根据上面的叙述,得知这个“+date+”还是需要使用单引号引起来的,如下:
roobtyan
2019/02/21
5.2K0
OD反汇编EXE添加一个启动时的消息框
最近有一个要修改PE文件的需求,就先从EXE文件下手吧,我也是初学一个小时而已,不过之前接触过一点汇编罢了,这篇文章算是个DEMO,主要的思路是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转到弹框区域再跳转回来去执行原来的代码,相关的工具有ollydbg,以及要修改的一个xp系统自带的扫雷软件,还有参考的文章,都会在文末给出。
WindRunnerMax
2021/06/17
1.2K0
OD反汇编EXE添加一个启动时的消息框
IDA反汇编EXE添加一个启动时的消息框
上一篇文章介绍了用OD反汇编EXE添加一个启动时的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转到弹框区域再跳转回来去执行原来的代码,相关的工具有IDA,以及要修改的一个xp系统自带的扫雷软件。本来想着用OD做就可以了,然后同学告诉我IDA功能更多一些,我了解了一下确实更加方便我完成需求,但是网络上关于IDA相关的教程还是比较少,我也是折腾了好一阵子才完成了修改,而且我也觉得有必要记录一下对于IDA的相关操作。
WindRunnerMax
2021/06/17
1.3K0
IDA反汇编EXE添加一个启动时的消息框
使用echarts时提示框的数据加单位
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106875.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/04
1.1K0
添加引用方式抛出和捕获干净的WebService异常
说明:【干净】指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”。
跟着阿笨一起玩NET
2018/09/20
8210
添加引用方式抛出和捕获干净的WebService异常
如何找到抛出ORA-00933错误的SQL
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
bisal
2019/11/20
2.5K0
如何找到抛出ORA-00933错误的SQL
关于MySQL连接抛出Authentication Failed错误分析
    1.只有用Connector/NET 出现这个问题, 用JDBC驱动没有类似问题。     2.多台应用服务器,只有一台报这个错,因此可以排除服务器端的问题。     3.问题非常随机,重启一下服务器/IIS,就能临时解决问题。     4.有一些场景应用服务器CPU并不是很高,也会偶尔抛出这个错来。
星哥玩云
2022/08/17
1.1K0
关于MySQL连接抛出Authentication Failed错误分析
PHP 报500 内部错误不抛出错误信息
访问其余文件能正常访问,只是在某个分组下事出现了500错误,主要是没抛出具体的错误信息。
槽痞
2020/06/23
1.9K0
Python学习 Day 11 错误处理 try 调用堆栈 记录错误 抛出错误
在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1。
统计学家
2019/04/10
1K0
WordPress新建页面没有评论框
WordPress是一个功能非常丰富的系统。对于新手而言,有些功能的开启关闭真的不太好找。不过,WordPress教程,如果大家善于使用度娘或者谷歌等炒鸡流弊的搜索引擎,发动你们的小拇指,去搜索百度一
herve
2018/06/25
1K0
nodejs显现events.js:72抛出错误
1. 需改nodejs中的侦听port。如将默认的80port改成8080port;
全栈程序员站长
2022/01/14
8790
编写可维护代码3:适当的抛出错误提示
在js开发中,调试错误是一个比较头疼的事,又不像java的debug那么方便,定位错误往往不是那么容易,除非对代码熟悉无比,但即使是自己写的代码,功能一复杂,时间一长,再想快速定位问题,至少我现在是比较头疼的。此时,如果有一个比较友好的错误提示,那解决问题的效率将大大提高。
前端_AWhile
2019/08/29
1K0
点击加载更多

相似问题

实体框架在加载时抛出异常

11

实体框架在回拨时没有提供我的ID

14

实体框架在获取DateTime时抛出异常

11

实体框架在执行lambda表达式时抛出错误

11

实体框架在执行UPDATE语句时抛出异常

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文