Bog*_*gey 3 c# entity-framework
我正在使用Entity Framework并且想要在数据库中插入一个对象,该对象引用了DB中尚不存在的另一个对象(但外键已知).
简单的例子:假设我有两个表Books(由他们的ISBN标识)和Purchases.我希望能够插入购买,即使该书尚未在数据库中设置:
public class Book
{
[Key]
public virtual string ISBN { get; set; }
protected virtual IEnumerable<Purchase> purchases { get; set; }
public virtual string author { get; set; }
public virtual string title { get; set; }
// .....
}
public class Purchase
{
[Key]
protected virtual int id { get; set; }
public virtual Book book { get; set; }
public virtual double price;
}
Run Code Online (Sandbox Code Playgroud)
从概念上讲,这很容易:Purchase表格将有一个外键,即书籍的ISBN.因此,在常规SQL中,我可以将ISBN插入此字段,稍后将该书添加到books表中.
在EF/C#中,我想不出一个简单的方法来做到这一点.本Purchase类引用Book类,所以我不能只使用ID(ISBN)直接在这里.
我能做的是创建一个虚拟书对象并使用它来插入购买.问题是Entity Framework自动将虚拟书对象插入到表中,我想避免这种情况:
var dummyBook = new Book();
dummyBook.isbn = "978-0141354217";
var purchase = new Purchase();
purchase.price = 99.95;
purchase.book = dummyBook;
dbContext.Purchases.Add(purchase);
// Should add the purchase to the DB, but NOT the book!
// Unfortunately, EF adds both automatically...
dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
谢谢!
尽管ISBN(应该)是唯一的并且似乎是主键的良好候选者,但使用任何自然键作为数据库中的主键绝不是一个好习惯.
详情请访问:http://en.wikipedia.org/wiki/Natural_key
因此,一旦ISBN不是您的主键,而只是字符串字段,您就可以按照自己的意愿行事:在没有图书记录的情况下插入特定ISBN的购买.在这种情况下,您将没有该类的virtual Book属性Purchase.你可以用这样的东西替换它:
public Book GetBook (string isbn, DbContext context)
{
return context.Books.Where(x => x.ISBN == isbn).FirstOrDefaul();
}
Run Code Online (Sandbox Code Playgroud)
所有这些都没有讨论为什么你购买了DB中不存在的书.
| 归档时间: |
|
| 查看次数: |
6032 次 |
| 最近记录: |