- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我看来 ForeignKey
属性对我不起作用,但我想我用错了 ;)
用代码解释更简单:
public class BaseCard
{
public int Id {get ; set; }
public int BaseCardId { get; set; }
public List<Skill> Skills { get; set; }
}
public class Skill
{
public int Id { get; set; }
public int BaseCardId { get; set; }
[ForeignKey("BaseCardId")]
public BaseCard BaseCard { get; set; }
}
当我尝试使用 seed 方法填充这些对象时,出现此错误:
INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Skills_dbo.BaseCards_BaseCardId". The conflict occurred in database "Database", table "dbo.BaseCards", column 'Id'.
在我看来,Skill
中的 ForeignKey
试图指向 BaseCards
的 Id
列BaseCardId
列,我不明白为什么..
如果我尝试删除 BaseCard
的“正常”Id
属性,并将 BaseCardId
设置为 PK(具有属性 [Key]
),我收到以下错误:
Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
有谁知道我如何让这段代码工作,以便 Skill
类的属性 BaseCardId
将指向 BaseCardId
属性BaseCard
,显然不是 Id
属性?
提前致谢!
最佳答案
BaseCard的Id可以自己设置,但是首先要用Fluent Api来指定这个和一对多的关系。此外,通过这种方式,您不必在模型类中指定属性。您的模型类将是这样的:
public class BaseCard
{
public int Id {get ; set; }
public virtual ICollection<Skill> Skills { get; set; }
}
public class Skill
{
public int Id { get; set; }
public int BaseCardId { get; set; }
public virtual BaseCard BaseCard { get; set; }
}
如您所见,我将导航属性更改为虚拟。如果您将导航属性定义为虚拟,EF 将在运行时创建一个派生自 BaseCard 类的新类(动态代理)并改用它(与技能)。这个新的动态创建的类包含在第一次访问时加载导航属性的逻辑。此功能称为延迟加载。它使 Entity Framework 能够避免从数据库中加载不需要的依赖对象的整个树。您可以在这些帖子中找到有关此主题的更多信息:Why Navigation Properties are virtual by default in EF和 Entity Framework 4.1 Virtual Properties .
我在您的模型中提出的另一个更改是在 Skills 属性中使用 ICollection<> 类型而不是 List<>。正如您在此 post 中看到的那样,在这种情况下,接口(interface)是一种很好的做法。它允许您稍后指定所需的实现(可以是 List<>)。
现在,回到您的问题,在您的 Context 类中,您需要重写 OnModelCreating 方法以指定关系以及 BaseCards 表中 Id 的非自动生成列。
public class YourContext : DbContext
{
public DbSet<BaseCard> BaseCards { get; set; }
public DbSet<Skill> Skill { get; set; }
//...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Configure the primary key for BaseCard
modelBuilder.Entity<BaseCard>().HasKey(t => t.Id);
//specify no autogenerate the Id Column
modelBuilder.Entity<BaseCard>().Property(b => b.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
//one-to-many relationship
modelBuilder.Entity<Skill>().HasRequired(c => c.BaseCard)
.WithMany(s => s.Skills)
.HasForeignKey(c => c.BaseCardId);
}
}
使用此配置,您必须始终将 BaseCard 对象的 Id 设置为不同的值。
如果您更喜欢使用数据注释,可以这样指定:
public class BaseCard
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
public virtual ICollection<Skill> Skills { get; set; }
}
public class Skill
{
[Key]
public int Id { get; set; }
public int BaseCardId { get; set; }
[ForeignKey("BaseCardId")]
public virtual BaseCard BaseCard { get; set; }
}
我的建议是使用 Fluent API,它更灵活,而且您不必接触模型类。您可以在此 post 中看到一些有用的考虑
关于c# - Entity Framework 代码优先外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27666857/
我正在使用“laravel/lumen-framework”:“5.7.*” 我有两个中间件,第一个 AuthTokenAuthenticate 应该应用于所有路由,因此它在 bootstrap/ap
当同时播放两个音频时...声音会相互抵消。如何解决这个奇怪的现象? 我有一些代码,其中单击按钮时有音频,并且每隔十秒就有音频(在后台服务中)。我有以下代码来在十秒间隔播放时停止按钮音频,并且工作正常:
我有一个功能可以在我的网站上搜索用户, 我的网站上还有一个面向 friend 的功能。 我有一个查询要在我的网站上搜索正确的用户,并且 我有一个查询可以确定用户的 friend ,他们都按应有的方式工
是否可以对记录使用 GROUP BY? 例如,我有一大堆联系人数据,可能包含也可能不包含所有信息 - 在 CSV 意义上,如果可能看起来像这样: Test User, Address1, Addres
如何在客户端 JavaScript 中创建一个环境,其中与用户界面和 View 相关的任何代码优先于其他代码? 我知道你可以使用 setTimeout([function],0); 将事情推到下一个刻
Jasmine 有没有办法定义测试失败的概率? 例如,现在 500'ing 的服务比不显示在页面上的简单内容更糟糕。 谢谢! 最佳答案 这不是单元或集成测试的工作方式。以太测试是否失败。并且您的套件中
我正在为我参与的一个项目开发一个 API。该 API 将由 Android 应用、iOS 应用和桌面网站使用。几乎所有 API 都只有注册用户才能访问。该 API 允许通过 WSSE 进行身份验证,这
我正在开发一些库并创建了这个有缺陷的代码: //------------------- Gmaps = {}; Gmaps.map = new Gmaps4RailsGoogle(); //there
我有一个使用[NSLocale ISOCountryCodes]获得的国家/地区的NSArray。如何排序此NSArray,以便可以将某些常用国家(地区)放在列表的顶部,同时将其余国家/地区按字母顺序
我正在为注册表编写代码,因为我正在从另一个文件中为电话号码列导入代码,但是当我将该代码放入其中时,您可以看到@include('layouts.phone');它显示为 当我放置@include('l
我刚刚遇到了 javascript 代码 file_upload_started = progress < 100; 我不知道如何阅读它,谷歌也没有真正出现太多。我什至不知道该怎么调用它,所以很难进行
目前,我正在 cppinstitute.org 学习 C 语言认证类(class)。在其中一个测验中,有一个如下的问题来识别输出。 int i = 1,j= 1; int w1,w2; w1 = (i
我想将无符号短值从 MSB 优先转换为 LSB 优先。做了下面的代码,但它不工作。有人可以指出我所做的错误吗 #include using namespace std; int main() {
考虑以下场景:我的应用程序有一些依赖于我自己的 POM 优先 Artifact (使用纯 Maven 构建)和一些依赖于我自己的 list 优先 Artifact (使用 Tycho 构建)。对于 P
拥有它应该是很自然的事情,我想知道是否有来自 TPL DataFlow 库的优先级缓冲区块的现成实现? 最佳答案 似乎实现这一目标的最佳方法是使用专门的 任务调度器 ,而不是实现您自己的 Buffer
我有一个 date 字段,它显示为从今天开始的天数。因此 2055-01-01 和 1950-01-01 将分别显示为正数和负数。现在我希望对这些进行排序,以便非负数按升序排在第一位,然后负数按降序排
我遇到一个问题,我看到我的事件类和悬停类正在 Firebug 中应用,但它没有优先于现有样式。 因此,如果我的元素设置了背景颜色,则事件和悬停背景颜色不会更改元素。 我该如何解决这个问题? 最佳答案
我正在考虑为 Salesforce Outbound Messaging 实现监听器应用程序。 walk through 使用已弃用的 ASMX Web 服务实现它。代码是使用带有/serverInt
对于每个表,EF 都会生成一个部分类,其中所有字段都可以公开访问,例如 public int ID { get; set; } 是否可以将 set 设为私有(private)?然后,我将只允许调用我的
我正在为水电站编写一个数据评估应用程序。我需要从服务器下载数据,该数据就在那里 - 作为 MySQL 表,格式化为 JSON 数组。现在,经过无数个小时的工作,我已经完成了连接到服务器、下载数据并将其
我是一名优秀的程序员,十分优秀!