Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多对多关系未正确保持_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 多对多关系未正确保持

C# 多对多关系未正确保持,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,请参见下面的DDL: create table Person (ID identity not null, varchar(name), primary key (id)) create table PersonSport (PersonID int not null references Person(ID), SportID int not null references Sport(ID)) create table Sport (ID identity int not null, des

请参见下面的DDL:

create table Person (ID identity not null, varchar(name), primary key (id))
create table PersonSport (PersonID int not null references Person(ID), SportID int not null references Sport(ID))
create table Sport (ID identity int not null, description varchar(20), primary key(id))
insert into sport (description) values ('running') //ID =1 from auto increment
insert into sport (description) values ('football') //ID = 2 from auto increment
实体框架正确地创建了两个类,即Person和Sport。然后我试试这个:

public int Create()
        {
            Person person = new Person();
        person.name = 'Bert';
             List<Sport> listSport = new List<Sport>;

            Sport sport = new Sport();
            sport.ID=1; //ID=1 is running
            Sport.Description='running';
            listSport.Add(sport);
            person.Sport = listSport;

            using (PersonSportEntities db = new PersonSportEntities())
            {
                db.Person.Add(person);
                db.SaveChanges();
            }
        }
public int Create()
{
Person=新人();
person.name='Bert';
List listSport=新列表;
运动=新运动();
sport.ID=1;//ID=1正在运行
运动。描述:跑步;
添加(运动);
person.Sport=listSport;
使用(personportenties db=new personportenties())
{
db.Person.Add(Person);
db.SaveChanges();
}
}
在这一切结束之后;实体框架似乎做到了这一点:

1)
插入运动(描述)值(“跑步”)//ID=3来自自动增量

2) 在Person(name)值('Bert')中插入

3)
插入PersonSport(1,3)//3是步骤1的自动增量

我希望它能做到这一点:

1) 在Person(name)值('Bert')中插入

2)
插入PersonSport(1,2)

我做错了什么?

试着这样做

public int Create()
    {
        Person person = new Person();
        person.name = 'Bert';

        using (PersonSportEntities db = new PersonSportEntities())
        {   
            List<Sport> sport = db.Sport.Where(x => x.ID = 1).ToList();
            person.Sport = sport;

            db.Person.Add(person);
            db.SaveChanges();
        }
    }
public int Create()
{
Person=新人();
person.name='Bert';
使用(personportenties db=new personportenties())
{   
列出sport=db.sport.Where(x=>x.ID=1.ToList();
人。运动=运动;
db.Person.Add(Person);
db.SaveChanges();
}
}

我想你们一定有3种型号<代码>个人
个人体育
体育

public class PersonSport
{
   public int Id {get; set;} //key and auto increment
   public int PersonId {get; set} //foreign key
   public int SportId {get; set} // foreign key

// relationship
   public virtual Person Person {get; set;} 
   public virtual Sport Sport {get; set;} 
}

public int Create()
    {
        var personSport=new PersonSport();
        personSport.SportId=1; 
        personSport.Person=new Person()
        {
         Name="Bert"
        };
        using (PersonSportEntities db = new PersonSportEntities())
        {   
            db.PersonSport.Add(personSport);
            db.SaveChanges();
        }
    }

个人
实例添加到上下文之前,只需将
附加
运动
实例(这样告诉EF将其视为现有实例,而不是新实例,如果您没有这样做):


在这种情况下,您不需要指定
Sport
对象属性而不是
Id
,因为它们是假的(也称存根)对象,只是为了创建链接。

什么是dbApplications实体类型?@Ikram Turgunbaev,谢谢。我已经更新了问题。那只是个打字错误。@Evk,谢谢。你说得对。我已经编辑了这个问题。如何确保EF仅向Person和PersonSport写入?在这种情况下,Sport是一个查找表。我想您需要通过执行
db.Entry(Sport.State=EntityState.Unmodified
,告诉EF
Sport
不是一个新实体。或者从数据库中获取sport而不是在代码中创建(可能不需要)。使用AddOrUpdate而不是AddEntity Framework不会为PersonSport创建类,因为它只包含复合主键。@w0051977 1。你的桌子结构不对。2.实体框架能够创建复合主键表。3.您的
PersonSport
表必须包含复合外键。请您再看一下这个问题。Person.Sport是一个列表。为什么您要共享不正确/缺失的代码,您使用的代码是否完全正确?谢谢,这正是我所期望的+1.我正在研究其他人开发的另一个应用程序,他们不会循环所有的运动来附加它们。EF似乎隐式地处理了这个问题。有没有一种方法可以配置EF隐式地执行此操作?不幸的是,没有。使用EF的开发人员总是可以处理断开连接的实体。
using (PersonSportEntities db = new PersonSportEntities())
{
    foreach (var sport in person.Sport)
        db.Sport.Attach(sport);
    db.PersonSport.Add(personSport);
    db.SaveChanges();
}