EF代码首先映射映射 [英] EF Code First mapping for collection

查看:98
本文介绍了EF代码首先映射映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我第一次使用EF 4.1 RC代码。我有一个很多关系的工作与复合PK在交接表的朋友。我们明确需要一个单独的Friends类(不要问)代表我们的连接表。我们的目标是能够从用户实体控制删除过程。请阅读其余内容: http:// mocella .blogspot.com / 2010/01 /实体框架-V4-对象graph.html 。所以,我们设法创建了我们的组合PK,但这破坏了我们的集合映射。问题是如何映射FriendsCol?

  public class User 
{
public int UserId {get;组; }
public string Name {get;组; }
public virtual ICollecion< Friends> FriendsCol {get;组; }

}

public class Friends
{
public int User1Id {get;组; }
public int User2Id {get;组; }

public User User1 {get;组; }
public User User2 {get;组;

}

有复合键映射

  public class FriendsMap:EntityTypeConfiguration< Friends> 
{
HasKey(m => new {m.userId1,m.userId2});

//this.HasRequired(x => x.User1)
//。WithMany()
//.HasForeignKey(x => x.User1Id)
//.WillCascadeOnDelete(false);

//this.HasRequired(x => x.User2)
// .WithMany()
// .HasForeignKey(x => x.User2Id)
// .WillCascadeOnDelete(false);
}

public class UserMap:EntityTypeConfiguration< UserNew>
{
public UserMap()
{
ToTable(users);
属性(user => user.Name).HasColumnName(name);
// HasMany< Friends>(user => user.FriendsCol).WithMany();

}
}


解决方案

这是删除相关实体的另一个失败。这是错误:*来自'Order_Lines'AssociationSet的关系处于已删除状态。给定多重约束,相应的Order_Lines_Target也必须在已删除状态。*

  class Program 
{
static void Main(string [] args)
{
int orderid1;
int Lineid2;
using(var context = new Context())
{
var u1 = new Order(){Name =A};
var l1 = new OrderLine(){Name =L1};
var l2 = new OrderLine(){Name =L2};

u1.Lines.Add(l1);
u1.Lines.Add(l2);
context.Orders.Add(u1);
context.SaveChanges();

Orderid1 = u1.Id;
Lineid2 = l2.Id;
}

using(var context = new Context())
{
var u1 = context.Orders.Find(Orderid1);
foreach(在u1.Lines中的var项目)
{
if(item.Id == Lineid2)
{
u1.Lines.Remove(item);
break;
}
}

context.SaveChanges();
}
}
}

public class OrderLine
{
public int Id {get;组; }
public string Name {get;组; }
public Order Order {get;组;
}

public class Order
{
public int Id {get;组; }
public string Name {get;组; }
public virtual ICollection< OrderLine>线{get;组; }

public Order()
{
Lines = new List< OrderLine>();
}
}

public class上下文:DbContext
{
public DbSet< Order>订单{get;组; }
public DbSet< OrderLine> OrderLiness {get;组;

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity< Order>()。HasMany< OrderLine>(o => o.Lines).WithRequired (l = l.Order);

}
}


I'm using EF 4.1 RC Code first. I have a many to many relation working with a composite PK in the junction table Friends. We explicitly need a separate Friends class (don't ask) which represents our junction table. Our goal is to be able to control the delete process from the User entity. Please read this before reading the rest: http://mocella.blogspot.com/2010/01/entity-framework-v4-object-graph.html. So, we managed to create our composite PK but this broke our mapping for the collection. The question is how to map FriendsCol?

public class User
{
    public int UserId { get; set; }
    public string Name { get; set; }
    public virtual ICollecion<Friends> FriendsCol { get; set; }

}

public class Friends
{
    public int User1Id { get; set; }
    public int User2Id { get; set; }

    public User User1 { get; set; }
    public User User2 { get; set; }

}

Have a composite key mapping

public class FriendsMap : EntityTypeConfiguration<Friends>
{
  HasKey(m => new { m.userId1 , m.userId2 });

  //this.HasRequired(x => x.User1)
  //.WithMany()
  //.HasForeignKey(x => x.User1Id)
  //.WillCascadeOnDelete(false);

  //this.HasRequired(x => x.User2)
  //    .WithMany()
  //    .HasForeignKey(x => x.User2Id)
  //    .WillCascadeOnDelete(false);
}

public class UserMap : EntityTypeConfiguration<UserNew>
{
  public UserMap()            
  {
    ToTable("users");
    Property(user => user.Name).HasColumnName("name");
    // HasMany<Friends>(user => user.FriendsCol).WithMany();

  }
}

解决方案

Here is another fail to delete related entities. And this is the error: *A relationship from the 'Order_Lines' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Order_Lines_Target' must also in the 'Deleted' state.*

class Program
    {
        static void Main(string[] args)
        {
            int orderid1;
            int Lineid2;
            using (var context = new Context())
            {
                var u1 = new Order() { Name = "A" };
                var l1 = new OrderLine() { Name = "L1" };
                var l2 = new OrderLine() { Name = "L2" };

                u1.Lines.Add(l1);
                u1.Lines.Add(l2);
                context.Orders.Add(u1);
                context.SaveChanges();

                Orderid1 = u1.Id;
                Lineid2 = l2.Id;
            }

            using (var context = new Context())
            {
                var u1 = context.Orders.Find(Orderid1);
                foreach (var item in u1.Lines)
                {
                    if (item.Id == Lineid2)
                    {
                        u1.Lines.Remove(item);
                        break;
                    }
                }

                context.SaveChanges();
            }
        }
    }

    public class OrderLine
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Order Order { get; set; }
    }

    public class Order
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public virtual ICollection<OrderLine> Lines { get; set; }

        public Order()
        {
            Lines = new List<OrderLine>();
        }
    }

    public class Context : DbContext
    {
        public DbSet<Order> Orders { get; set; }
        public DbSet<OrderLine> OrderLiness { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Order>().HasMany<OrderLine>(o => o.Lines).WithRequired(l => l.Order);

        }
    }

这篇关于EF代码首先映射映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆