我有一个ASP.NET MVC3应用程序,我使用Entity Framework 4.3 Code-First和Migrations.
我一直在尝试在相同类型的实体之间创建多对多关系,但是当我使用迁移构建迁移时,它会生成一对一的关系.
这个想法是一个用户应该能够跟随多个其他用户(想想Twitter).
我的User模型看起来像这样:
public class User
{
public int UserId { get; set; }
public string Name { get; set; }
public DateTime Registered { get; set; }
...
public virtual ICollection<User> Follows { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我支持添加的Follows-property时,我得到这样的迁移:
public partial class FollowUser : DbMigration
{
public override void Up()
{
AddColumn("User", "User_UserId", c => c.Int());
AddForeignKey("User", "User_UserId", "User", "UserId");
CreateIndex("User", "User_UserId");
}
...
}
Run Code Online (Sandbox Code Playgroud)
因此,实体框架将我的模型解释为两个用户之间的一对一关系.
如何在相同类型的实体之间创建多对多关系?
c# entity-framework ef-code-first asp.net-mvc-3 ef-migrations
下面的一对一关系示例抛出异常
public class User
{
public int Id { get; set; }
public Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public User User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
例外说:
无法确定类型"ConsoleApplication1.Address"和"ConsoleApplication1.User"之间关联的主要结束.必须使用关系流畅API或数据注释显式配置此关联的主要结尾.
如果我从地址中删除用户属性但我不想要它.
我怎么能有这样的关系,没有例外?
我试图公开EF代码首先在多对多关系中自动创建的链接类作为单独的对象,因为该链接对象需要在其他类中引用,但是我似乎遇到了获取存在于其他类中的数据的问题.数据库.
我有以下3个对象:
public class Role : Entity
{
public virtual ICollection<User> Users { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<Permission> Permissions { get; set; }
}
public class User: Entity
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public virtual ICollection<Role> Roles { get; set; }
}
public class …Run Code Online (Sandbox Code Playgroud) 我正在研究一些通过EF4.3使用单表继承的代码.
有一个名为User的实体和另一个名为Admin的实体.Admin继承自用户.
用户类
public class User
{
public int Id {get;set;}
public string Username {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
管理员班
public class Admin : User { }
Run Code Online (Sandbox Code Playgroud)
EF使用Discriminator列生成数据库表.当Admin添加记录,然后Discriminator="Admin"和用户记录将有Discriminator="User".
我的问题是,Discriminator如果我想User进入并且如何更新列Admin?
我尝试从一种对象类型转换到另一种对象类型并使用EF保存.但这不会改变Discriminator列.我该如何改变它?
谢谢你的帮助.
以前没见过这个错误,粗略的网页搜索很少见.这是(我认为)有问题的代码:
this.HasMany(a => a.ListItems).WithRequired()
.Map(m =>
{
m.MapKey("AttributeId");
m.ToTable("ProductAttributeListItem");
}
)
;
Run Code Online (Sandbox Code Playgroud)
这是完整的错误:
在模型中找不到指定的表'ProductAttributeListItem'.确保已正确指定表名.
桌子在那里拼写正确.
缺乏搜索结果让我觉得我错过了一些明显的东西.可能是什么?
我有一个实体名册,有一系列球员.
public class Roster
{
public Roster()
{
Players = new List<Player>();
}
public int RosterId { get; set; }
[MaxLength(100)]
[Required]
public string RosterName { get; set; }
public ICollection<Player> Players { get; set; }
}
public class Player
{
public int PlayerId { get; set; }
[MaxLength(100)]
[Required]
public string PlayerName { get; set; }
public virtual ICollection<Roster> Rosters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我使用流畅的api定义了这种关系
// many to many Roster - Players
modelBuilder.Entity<Roster>()
.HasMany(t => t.Players)
.WithMany(t=>t.Rosters)
.Map(m …Run Code Online (Sandbox Code Playgroud) c# many-to-many entity-framework ef-code-first entity-framework-4.3
现在我已经通过以下方式从现有数据库生成了19个代码优先类:
我想要的所有课程都已生成,我对他们非常满意......
现在我的问题
我想我的整体问题是,为什么它们位于.tt文件夹中?我现在该如何更新我的数据库?通过手动编辑数据库然后更新Model,然后再次生成dbContext?或者是否有从.tt文件夹中获取.cs文件的技巧?
如何你修改你的数据库生成您的DbContext后?
class User {
public int Id {set;get;}
public int ExternalId {set;get;}
}
Run Code Online (Sandbox Code Playgroud)
我定义了这个类.我首先使用代码EF.
public class FooContext : DbContext {
public DbSet<User> Users { set; get; }
}
Run Code Online (Sandbox Code Playgroud)
所以当我做以下事情时:
db.Users.ToList().where(x=>x.ExternalId == externalId);
Run Code Online (Sandbox Code Playgroud)
我很好奇,如果这样做:
select whatever from Users where ExternalId = 'id I passed in';
Run Code Online (Sandbox Code Playgroud)
或者它将所有用户加载到内存并在内存中执行Linq?
查询具有条件(where子句)的表的最佳实践是什么?
我有以下EF代码的第一个代码.它工作正常.但当我寻找'club2.Members'的价值时,它会说:
'club2.Members'抛出了'System.ObjectDisposedException'类型的异常.
消息是:
ObjectContext实例已被释放,不能再用于需要连接的操作.
我没有为Members属性设置值.没关系.但是它不应该在内部引起任何异常.
注意:我不需要俱乐部实体中的会员数据(在我打电话的时候).即使当时没有成员加入俱乐部.我只需要摆脱异常; 不使用预先加载来加载数据.如何避免异常?

namespace LijosEF
{
public class Person
{
public int PersonId { get; set; }
public string PersonName { get; set; }
public virtual ICollection<Club> Clubs { get; set; }
}
public class Club
{
public int ClubId { get; set; }
public string ClubName { get; set; }
public virtual ICollection<Person> Members { get; set; }
}
//System.Data.Entity.DbContext is from EntityFramework.dll
public class NerdDinners : System.Data.Entity.DbContext
{
public …Run Code Online (Sandbox Code Playgroud) 我们有以下一组对象.
public class Form
{
public int FormId { get; set; }
public DateTime DateCreatedOn { get; set; }
public string Status { get; set; }
}
// This is using TPT inheritance from Form
[Table("FormA")]
public class FormA : Form
{
public string ExtraInfoA { get; set; }
public virtual ICollection<Child> Children
}
// This is using TPT inheritance from Form
[Table("FormB")]
public class FormB : Form
{
public string ExtraInfoB { get; set; }
public virtual ICollection<Adult> Adults …Run Code Online (Sandbox Code Playgroud)