[英]Elides junction table, how do I insert a row without querying the database for the entities referenced by the row?
[英]How can I insert a row in my database that has a foreign key without adding a row in the linked table?
我在我的项目中使用 Database First 创建了一个实体 Model。 在我的数据库中,我有两个表。 一本用于书籍,一本用于作者。 这些书在 authortable 上有一个外键。 每次我想添加一本新书时,我都会添加一个新作者,即使指定的作者已经存在或者我遇到了错误。
这是我的课:
书
public partial class BOOK
{
public int ID { get; set; }
public string TITLE { get; set; }
public int PAGENUMBER { get; set; }
public int AUTHOR { get; set; }
public virtual AUTHOR AUTHOR1 { get; set; }
}
作者
public partial class AUTHOR
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public AUTHOR()
{
this.BOOK = new HashSet<BOOK>();
}
public int ID { get; set; }
public string FIRSTNAME{ get; set; }
public string LASTNAME{ get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<BOOK> BOOK { get; set; }
}
我尝试了几种方法来添加这本书,当我创建它时,我指定了作者或将新书添加到作者列表中。 大多数情况下,它会导致错误,并且第一次将作者添加到作者表中第二次。 也许我遗漏了一些明显的东西或者不知道某种方法,因为我是实体框架的绝对初学者。
编辑:我之前一直试图通过 select 查询获取作者,并将其作为 object 传递给本书。
var functions= new DbFunctions();
var author = functions.SelectAuthor(8); //Select with the ID
var book = new BOOK()
{
AUTHOR1 = author,
TITLE= "ABC",
PAGENUMBER = 30,
};
var context = new EF6_DbFirst_DatabaseEntities();
context.BOOK.Add(book);
context.SaveChanges();
这将返回此错误:System.InvalidOperationException:“IEntityChangeTracker 的多个实例无法引用实体 object。”
我对 Code First 方法了解不多,但是如果你想达到你的目标,你应该对 sql 服务器中的INNER JOINS有所了解。
我的意思是您应该在Books表中添加一个与Authors表中的键匹配的新行,我们称之为Foreign key 。
我希望这个链接可以帮助你实现你想要的:
https://www.sqlservertutorial.net/sql-server-basics/sql-server-inner-join/
我找到了简单的答案。 如果我只是在创建这本书时将作者 ID 提供给 AUTHOR,它就可以工作。 我一次又一次地错过了这种简单的方法。
var functions= new DbFunctions();
var author = functions.SelectAuthor(8); //Select with the ID
var book = new BOOK()
{
AUTHOR = author.ID, //this simple Change will did it correct
TITLE= "ABC",
PAGENUMBER = 30,
};
var context = new EF6_DbFirst_DatabaseEntities();
context.BOOK.Add(book);
context.SaveChanges();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.