实体框架4.1代码优先的方式创建许多一对多的关系 [英] Entity Framework 4.1 Code First approach to create many-to-many relation
问题描述
我使用Silverlight的5测试版SDK和4.1的EntityFramework在Silverlight应用程序。
I'm using the Silverlight 5 Beta SDK and the EntityFramework 4.1 in an Silverlight Application.
我会尝试创建两个表作者和书'。在SQL中,应该有三分之一(加盟)表,这使得许多一对多作者与书之间的关系(一个作者可以写很多书和一本书,可以从许多作者写的)。
I'll try to create the two tables 'Author' and 'Book'. In SQL, there should be a third (join) table, which makes the many-to-many relation between Author and Book (one author could have written many books and a book could be written from many authors).
这是我到目前为止有:
namespace CodeFirst.Models.Web
{
public class Author
{
public Author()
{
this.Books = new HashSet<Book>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Book> Books { get; set; }
}
public class Book
{
public Book()
{
this.Authors = new HashSet<Author>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[Required]
public string Name { get; set; }
public ICollection<Author> Authors { get; set; }
}
// Should I do something like that:
public class AuthorMapping : EntityTypeConfiguration<Author>
{
public AuthorMapping() : base()
{
//this.HasMany (g => g.Books)
// .WithMany(m => m.Authors)
// .Map (gm => gm.ToTable ("Author_Book")
// .MapLeftKey ("AuthorID")
// .MapRightKey("BookID"));
}
}
public class CodeFirstModelContext : DbContext
{
public CodeFirstModelContext() : base()
{
this.Database.Connection.ConnectionString = @".\MSSQLSERVER2008;Database=CodeFirst;Trusted_Connection=true;";
}
public DbSet<Author> Authors { get; set; }
public DbSet<Book> Books { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AuthorMapping());
// tell Code First to ignore PluralizingTableName convention
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
[EnableClientAccess()]
public class CodeFirstDomainService : DomainService
{
public CodeFirstDomainService()
{
this.m_modelContext = new CodeFirstModelContext();
}
public IQueryable<Author> GetAuthors()
{
return this.m_modelContext.Authors;//.Include("Books");
}
public void InsertAuthor(Author Author)
{
this.m_modelContext.Insert(Author);
}
public void UpdateAuthor(Author Author)
{
this.m_modelContext.Update(Author, this.ChangeSet.GetOriginal(Author));
}
public void DeleteAuthor(Author Author)
{
this.m_modelContext.Delete(Author);
}
public IQueryable<Book> GetBooks()
{
return this.m_modelContext.Books;//.Include("Authors");
}
public void InsertBook(Book Author)
{
this.m_modelContext.Insert(Author);
}
public void UpdateBook(Book Author)
{
this.m_modelContext.Update(Author, this.ChangeSet.GetOriginal(Author));
}
public void DeleteBook(Book Author)
{
this.m_modelContext.Delete(Author);
}
protected override void Dispose(bool disposing)
{
if (disposing)
this.m_modelContext.Dispose();
base.Dispose(disposing);
}
protected override bool PersistChangeSet()
{
this.m_modelContext.SaveChanges();
return base.PersistChangeSet();
}
private CodeFirstModelContext m_modelContext;
}
}
最明显的问题是,导航性能(在作者与书作者)图书不会从我的客户端项目中的代码设计器创建。
The most obvious problem is, that the navigation properties (Books in Author and Authors in Book) aren't created from the code designer in my client project.
什么我需要做什么?
编辑:
好吧,现在我能够只NavigationProperties之一同时使用。如果我尝试'包含'两个我得到了以下错误:
Okay, now I'm able to use only one of the NavigationProperties simultaneously. If I try to 'Include' both I'm getting the following error:
Association 'Author_Book' defined on entity type 'CodeFirst.Models.Web.Author' is invalid. It is a foreign key association but the property type is not a singleton.
这是我更新的代码:
public class Author
{
public Author()
{
this.Books = new Collection<Book>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[MaxLength(32)]
[Required]
public string Name { get; set; }
[Association("Author_Book", "ID", "ID")]
[Include]
public Collection<Book> Books { get; set; }
}
public class Book
{
public Book()
{
this.Authors = new Collection<Author>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[MaxLength(32)]
[Required]
public string Name { get; set; }
[Association("Author_Book", "ID", "ID")]
[Include]
public Collection<Author> Authors { get; set; }
}
public class AuthorMapping : EntityTypeConfiguration<Author>
{
public AuthorMapping() : base()
{
this.HasMany (g => g.Books)
.WithMany(m => m.Authors)
.Map (gm => gm.ToTable("Author_Book"));
}
}
public class BookMapping : EntityTypeConfiguration<Book>
{
public BookMapping() : base()
{
this.HasMany (m => m.Authors)
.WithMany(g => g.Books)
.Map (gm => gm.ToTable("Author_Book"));
}
}
在我看来,那实体框架仍然ISN ŧ能够处理许多一对多的关系。 。至少,这是错误信息意味着什么
It seems to me, that Entity Framework still isn't able to deal with many-to-many relations. At least, that's what the error message implies.
EDIT2:
我已经改变了我的代码我读过之后< A HREF =http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/d894c8af-5985-4995-88e2-c8733e4a51ea相对=nofollow>这个职位上social.msdn
public class Author
{
public Author()
{
this.Books = new Collection<Book>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[MaxLength(32)]
[Required]
public string Name { get; set; }
[Association("Author_Book", "Book_ID", "Author_ID")]
[Include]
[ForeignKey("Book_ID")]
public Collection<Book> Books { get; set; }
public int Book_ID { get; set; }
}
public class Book
{
public Book()
{
this.Authors = new Collection<Author>();
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int ID { get; set; }
[MaxLength(32)]
[Required]
public string Name { get; set; }
[Association("Author_Book", "Author_ID", "Book_ID")]
[Include]
[ForeignKey("Author_ID")]
public Collection<Author> Authors { get; set; }
public int Author_ID { get; set; }
}
它不会固定我的问题。相同的误差仍然存在。我测试过去除AssociationAttribute没有成功。我做somethinf错在这里?
It doesn't fixed my problem. The same error is still present. I've tested to remove the AssociationAttribute without success. Am I doing somethinf wrong here?
推荐答案
我觉得这里的问题在于WCF RIA服务,没有什么EF相关。也就是说,WCF不喜欢的接口。解决办法是使用收藏
而不是的ICollection
的。我敢肯定,EF不会介意它,它会解决您的WCF问题。
I think problem here lies in the WCF RIA service, not anything EF related. That is, that WCF doesn't like interfaces. Solution would be use Collection
instead of ICollection
. I'm sure EF won't mind it and it will fix your WCF problem.
修改:这可能会解决你的问题的 http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/d894c8af-5985-4995-88e2-c8733e4a51ea
Edit: This may solve your problem http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/d894c8af-5985-4995-88e2-c8733e4a51ea
这篇关于实体框架4.1代码优先的方式创建许多一对多的关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!