我在Silverlight应用程序中使用Silverlight 5 Beta SDK和EntityFramework 4.1。
我会尝试创建两个表'Author'和'Book'。在SQL中,应该有第三个(连接)表,它在Author和Book之间建立多对多关系(一个作者可以编写很多书,一本书可以从许多作者那里编写)。
这是我到目前为止所得到的:
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;
}
}
最明显的问题是导航属性(Book中的Books和Authors中的Books)不是从我的客户端项目中的代码设计器创建的。
我需要做什么?
修改 好的,现在我只能同时使用其中一个NavigationProperties。如果我试图'包含',我会收到以下错误:
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"));
}
}
在我看来,实体框架仍然无法处理多对多关系。至少,这就是错误信息所暗示的内容。
EDIT2: 我在阅读this post on 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但没有成功。我在这里做错了吗?
答案 0 :(得分:4)
我认为这里的问题在于WCF RIA服务,而不是EF相关的任何问题。也就是说,WCF不喜欢接口。解决方案是使用Collection
而不是ICollection
。我确信EF不会介意它,它会解决你的WCF问题。