【发布时间】:2012-10-09 17:49:04
【问题描述】:
为了说明我的问题,假设我有一个数据模型,其中有一组书籍,每本书都有一个或多个草稿,还有一个“当前”草稿。我希望我的模型看起来像这样:
class Book
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Draft> Drafts { get; set; }
public virtual Draft CurrentDraft { get; set; }
}
class Draft
{
public int Id { get; set; }
public virtual int BookId { get; set; }
public virtual Book Book { get; set; }
public string Description { get; set; }
}
我有一个如下所示的 DbContext:
class TestDbContext : DbContext
{
public DbSet<Book> Books { get; set; }
public DbSet<Draft> Drafts { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
base.OnModelCreating(modelBuilder);
}
}
...还有一个像这样的简单程序:
static void Main(string[] args)
{
Database.SetInitializer<TestDbContext>(new DropCreateDatabaseAlways<TestDbContext>());
using (var db = new TestDbContext())
{
var book = new Book() { Title = "War and Peace", Drafts = new List<Draft>() };
var draft1 = new Draft() { Book = book, Description = "First Draft" };
book.Drafts.Add(draft1);
var draft2 = new Draft() { Book = book, Description = "Second Draft" };
book.Drafts.Add(draft2);
book.CurrentDraft = draft2;
db.Books.Add(book);
db.SaveChanges();
foreach (var b in db.Books)
{
Console.WriteLine("Book {0}: {1}", b.Id, b.Title);
foreach (var d in book.Drafts)
Console.WriteLine("\tDraft ID {0}: {1} from Book ID {2}", d.Id, d.Description, d.BookId);
Console.WriteLine("Current draft has ID {0}", b.CurrentDraft.Id);
}
Console.ReadKey();
}
}
当 EF 创建 DB 时,它看起来像这样:
[我对额外的 Book_Id 列并不感兴趣,但如果它有效,我可以接受它。]
可悲的是,当我运行测试程序时,它在SaveChanges 调用时失败了,但有一个例外:
保存不公开外键的实体时出错 他们关系的属性。 EntityEntries 属性将 返回 null,因为无法将单个实体标识为源 的例外。可以进行保存时的异常处理 通过在实体类型中公开外键属性更容易。看 InnerException 了解详情。
我尝试在 OnModelCreating 中使用流畅的 API,但是当我尝试以这种方式配置它时,它会因为 Books 和 Drafts 之间存在两种 FK 关系而感到困惑。我对流利的东西(或一般的 EF)不够熟悉,不知道如何正确地做到这一点。
这甚至可以在 EF 代码中实现吗?
【问题讨论】:
-
内部异常说明了什么?是否抛出了 SQL 异常?
-
我通常以 db-first 工作,所以可能不符合标准,但 Book 不想要 CurrentDraftId 属性吗?
标签: c# entity-framework ef-code-first entity-framework-5