繁体   English   中英

如何在我的数据库中插入具有外键的行而不在链接表中添加行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM