如何将2个非分层类映射到具有定义列的同一个表&实体框架中的价值?

时间:2014-10-27 18:35:05

标签: c# entity-framework fluent

因此,有一种方法可以将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创建一个视图。

2 个答案:

答案 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是一个特别好的名字,所以也许你必须想出更有意义的东西。