gpt4 book ai didi

c# - Entity Framework 4.1 Code First 创建多对多关系的方法

转载 作者:太空狗 更新时间:2023-10-29 17:56:38 25 4
gpt4 key购买 nike

我在 Silverlight 应用程序中使用 Silverlight 5 Beta SDK 和 EntityFramework 4.1。

我将尝试创建“作者”和“书籍”这两个表。在 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;
}
}

最明显的问题是,导航属性(Books in Author 和 Authors in Book)不是由我的客户端项目中的代码设计器创建的。

我需要做什么?

编辑:好的,现在我只能同时使用一个 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"));
}
}

在我看来, Entity Framework 仍然无法处理多对多关系。至少,错误消息是这样暗示的。

编辑 2:阅读 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 但没有成功。我在这里做错了什么吗?

最佳答案

我认为这里的问题出在 WCF RIA 服务上,与 EF 无关。也就是说,WCF 不喜欢接口(interface)。解决方案是使用 Collection 而不是 ICollection。我相信 EF 不会介意它,它会解决您的 WCF 问题。

编辑:这可能会解决您的问题http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/d894c8af-5985-4995-88e2-c8733e4a51ea

关于c# - Entity Framework 4.1 Code First 创建多对多关系的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5936849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com