因此,有一种方法可以将EF中的2个分层类映射到具有定义列和值(http://msdn.microsoft.com/en-us/data/jj591617.aspx#2.4)的同一个表中。我想知道是否有办法以相同的方式将2个非分层类映射到同一个表。
示例:
class User
Guid Id
string Name
Guid? GroupId
class Group
Guid Id
string Name
Table
uid Id PK
varchar Name
bit IsGroup
uid GroupId nullable
我无法更改该表的架构,因此我到目前为止唯一的解决方案是为用户创建一个视图,为Group创建一个视图。
答案 0 :(得分:0)
沫,
我认为在一天结束时,您将访问包含属于它的用户的用户组。如果是这样的话就会让你开始。请记住,这不是一个“最佳实践”,只是一个让您启动并运行的示例。您需要根据具体情况调整此代码。
这是它的基本玩笑。您需要为group提供List类型的属性,然后从数据库查询中填充用户列表。在下面的例子中,我写了一个处理填充列表的方法。但是在实践中,您不必在此处填充列表,您可以实例化userGroup并从操作方法中填充用户列表。就像我说的那样,这不仅仅是一个简单的例子。
这是一个例子。
public class userGroup
{
class user
{
private int id { get; set; }
private string name { get; set; }
private Guid grpId { get; set; }
public int userId { get { return id; } set { id = value; } }
public string userName { get { return name; } set { name = value; } }
public Guid groupId { get { return grpId; } set { grpId = value; } }
public user() { }
}
class group
{
private Guid id { get; set; }
private string name { get; set; }
public List<user> usersInGroup = new List<user>();
public Guid groupId { get { return id; } set { id = value; } }
public string groupName { get { return name; } set { name = value; } }
public group() { }
}
public userGroup() { }
public group getUserGroup()
{
group x = new group();
Guid newGroupId = Guid.NewGuid();
x.groupId = newGroupId;
var userQuery = myDB.Where(n => n.myField == myConditon).Select(n => new
{
n.userId,//I'm assuming that the database query returns a field userId
n.userName//I'm assuming that the database query returns a field userName
});
foreach(var user in userQuery)
{
userGroup.user y = new userGroup.user();
y.groupId = newGroupId;
y.userId = user.userId;
y.userName = user.userName;
x.usersInGroup.Add(user);
}
return x;
}
}
我希望我明白你的问题,我的例子指出你正确的方向。 最好的祝愿, 比尔
答案 1 :(得分:0)
您可以通过引入两种类型派生的抽象基类型来轻松地对此进行建模。
public abstract class BaseNamedEntity
{
public Guid Id { get; set; }
public string Name { get; set; }
}
public class Group : BaseNamedEntity
{
public virtual ICollection<User> Users { get; set; }
}
public class User : BaseNamedEntity
{
public Guid GroupId { get; set; }
public virtual Group Group { get; set; }
}
在上下文中,您告诉IsGroup
是鉴别器:
public class MyContext : DbContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<BaseNamedEntity>().ToTable("MyTable");
modelBuilder.Entity<Group>().Map(m => m.Requires("IsGroup")
.HasValue(true));
modelBuilder.Entity<User>().Map(m => m.Requires("IsGroup")
.HasValue(false));
}
public DbSet<BaseNamedEntity> BaseNamedEntities { get; set; }
}
我不认为BaseNamedEntity
是一个特别好的名字,所以也许你必须想出更有意义的东西。