English 中文(简体)
B. 更新实体框架的主要价值
原标题:Update primary key value using entity framework
  • 时间:2009-09-02 13:41:35
  •  标签:

I m 试图从实体框架中更新一个复合主要钥匙的一个价值,I m 发现这一错误: “财产客户信息数据库是物品关键信息的一部分,不能修改。 “......

我的守则是:

Dim customer As Customer = (From c In db.Customer Where c.CustomerID = "xxx" AndAlso c.SiteKey = siteKey).FirstOrDefault
customer.CustomerID = "fasdfasdf"
db.SaveChanges()

这似乎过于简单。 您能否更新实体框架内的主要关键内容? 我找不到有关这个专题的任何文件。 感谢!

最佳回答

你们可以出于良好的理由。 See KM comments.

我说,你可以做的是两个表格,一个是匿名数据,另一个是记录真实用户数据。

或者(我从未测试过或曾经做过)你可以做这种表态:

---Customers----
AutoNumber PK <- This links to all other tables in your database, and does NOT change.
CustomerID  <- This can change.
CustomerType <- Anonymous or logged in.  

当他们出现在你时,客户汇款和客户信息数据库就会改变你们的需要。

因此,请你考虑:

Dim customer As Customer = (From c In db.Customer _
                            Where c.CustomerID = {Some temp ID} _
                            AndAlso c. CustomerType = "Anonymous").FirstOrDefault
// After user logs in.
customer.CustomerID = {Make a new user ID here}
customer.CustomerType = "LoggedIn" {or what ever}
db.SaveChanges()

请注意,汽车编号主要钥匙never变动。 因此,你与客户表格有关系的任何表格都仍在工作,而不必在主要钥匙上做一些更新(例如,在表面上带有铅)。

问题回答

在数据库领域,我有博士学位,因此这一答案与方案者的观点相差不多。 关于奥利弗·汉普西,如果钥匙不是表面钥匙,那么关键人物可以而且有时会发生变化。 E.g. 天然钥匙或堆肥钥匙。 例如。 你们的SSN有可能在美国发生变化。 但是,多年来许多方案家将认为这是一个不可改变的关键,并以此来加以利用。 改变由外国钥匙组成的综合主要关键更为常见。

I m处理一个具有永久关系的数据库。 具体来说,三个实体(外国钥匙在各自的表格中加列主要钥匙)。 但是,在改变第三个实体时保持两个实体之间的关系要求<>。 改变部分交叉表格(也称为关于MSDN的纯合并表格)的主要关键。 这是一项有效的设计,只能通过取消永久关系交汇表来加以改进,并以两个双亲关系表取代(可能有自己的代用钥匙)。 欧洲法院将处理这一罚款。 这种设计变化将形成一种(Many->many)->many或Young1-Parent2-> Child-grandchild模型(如果下文不明确)。 实体框架将对此进行细致的工作,因为每个关系实际上都是一种与许多关系。 但是,从亚洲开发银行的角度来看,它设计了cra。 让我举一个例子,说明原因。

认为课程、课堂和校内相互连接。 班级可包括:课程设置、教室信息、校内学生 ID as foreign keys and contained a composit main key, including all three. 虽然有一个清晰、简明的永恒模式(三种方式的关系),但我们可以将其分为双亲关系。 这将提供两个交叉表格。 添加代用钥匙符合以下标准:

类别(SurrogateKeyClas,InstructorID,CourseID)

班次

这一设计的问题在于,我们可以有相同的课程,教员可以有多个时间,而以前的模式则避免了这种情况。 为了避免这一问题,你可以在数据库中增加两个国际发展法领域独一无二的制约因素,但是,如果你只是处理即将开始的关键,你为什么要这样做? 然而,这一解决办法将尽我所能。 然而,由于非自然的独特制约,这并不是逻辑数据库的设计。

BUT,如果你不想改变你的数据库或改变其数据库,这里是second Solutions: 部门间/联系表只是将两个实体或两个实体联系起来。 如果作一改动,就删除协会,并重开具有适当外国钥匙(导航特性)的新钥匙。 这意味着不允许你在任何关系中要求儿童实体,但这非常普遍。

我建议,实体框架(今后)允许那些能够设计一个名副其实的亚行模式的人在我们想要时改变交叉/联系表格中的关键部分!

另一项免费实例:

考虑学生课程,格拉德协会。 学生通过一年级学习课程。 通常,这在学生和在称为年级的协会表格中增设一个领域的课程中是许多到许多的联系人(协会表格有像职等这样的有效载荷数据,交叉表格没有有效载荷,在MSDN中被指为一个地方的单纯加入表格):

学生(StudentID) ......

课程(CourseID) ......

Taking(StudentID,CourseID,年级)

如果某人从退学中得出数据输入错误,将学生带入错误的班级,那么你就希望他们以后再选择退学,选择不同的课程。 在这种背景下,你需要从速计桌上删除欧阵标,并在不失去等级的情况下重新计算。 简单地修改“外国钥匙,似乎是一种更好的选择。 如果这似乎有争议,就与你自己的协会讨论,但作为教授,我是自然的。

结论: 如果你有一系列关系,则最好不要允许碎块和(或)改变FK,但如有需要,则存在可再生/可测情景,即使没有在上建议作为最佳做法。

这个问题可能表现在以下例外情形中,取决于您是否正在改变航行财产或模型中的关键财产:

侵犯人格尊严的行为发生: 在未变受保物体时,作为参考性完整性限制的一部分的主要关键财产不能改变,除非该物品被设定为协会的主要目标。 主要目标必须经过跟踪,没有标记去删除。

财产X是物体关键信息的一部分,不能修改。

您无法通过实体框架更新主要关键内容,因为实体框架不知道哪些数据库可以更新。

然而,如果你真的需要,你可以撰写一份储存的程序,更新主要钥匙,然后从实体框架执行所储存的程序。

如果在任何时间都只能有一例数据库,那么修改纸面不会有这样的问题。 但是,每一种情况都保持了自己的切身之处,可以打破你想要修改的记录。

EF与数据库的互动利用了(从背景的切身处)的墨迹,以确认它们正在查询的记录。 如果背景物体能够更新关键持久性,则其他环境物体所依赖的身份信息即刻和永久错误。

简言之,如果你更新了主要钥匙,你就会使可能所有其他情况下的海滩失去效力,从而从根本上打破了EF。 这是它为什么要更新一张纸板,令人感到不好的原因之一。

页: 1 旧实体和insert,再用经过修改的识别码重新编号。 最容易的方法是,JSON将目标扼杀起来,以制造衣物。

var cloned_account = DeserializeObject<account>(SerializeObject(existing_account));
cloned_account.user_id = 1;

db.account.Remove(existing_account);
db.account.Add(cloned_account);

我建议,不要更新主要钥匙,而是用新的主要钥匙插入另一行,删除旧钥匙。 然而,你们需要认识到改变所有儿童实体,以提及新的主要奶制品





相关问题