Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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# 与EF C中的相互依赖实体合作#_C#_Sql_Entity Framework_Dependency Management - Fatal编程技术网

C# 与EF C中的相互依赖实体合作#

C# 与EF C中的相互依赖实体合作#,c#,sql,entity-framework,dependency-management,C#,Sql,Entity Framework,Dependency Management,我必须去实体A和B A具有以下字段: id(PK)和b_-fk(fk到b的id)。 B具有类似的字段: id(PK)和a_-fk(fk到a的id) 现在我想创建对象A和B: createAAndBMethod(Entities context){ A a = new A(); B b = new B(); a.b_fk = b; b.a_fk = a; context.As.AddObject(a); context.Bs.AddObject(b)

我必须去实体
A
B

A
具有以下字段:
id
(PK)和
b_-fk
(fk到
b的id
)。
B
具有类似的字段:
id
(PK)和
a_-fk
(fk到
a的id

现在我想创建对象
A
B

createAAndBMethod(Entities context){
    A a = new A();
    B b = new B();
    a.b_fk = b;
    b.a_fk = a;
    context.As.AddObject(a);
    context.Bs.AddObject(b);
}

someImportantMethod(){
    //do sth
    Entities context = new Entities(...);
    //do sth, maybe some changes to db on context
    createAAndBMethod(context);
    //do sth, maybe some changes to db on context
    context.SaveChanges();// <-- here I'm getting error
}
更新:
a_-fk
b_-fk
都可以为空。我正在使用MS SQL和Azure SQL

更新2: 我将
createAAndBMethod(实体上下文)
更改为:

createAAndBMethod(Entities context){
    A a = new A();
    context.As.AddObject(a);
    B b = new B();
    a.b_fk = b;
}

但它仍然无法处理相同的错误。

尝试删除以下行:

b.a_fk = a;

context.Bs.AddObject(b);
我想你应该在上下文中添加两次object
b
。EF在使用外键添加对象
a
时自动执行此操作

更新:

尝试以下两种变体:

  createAAndBMethod1(Entities context)
  {
        A a = new A();
        B b = new B();
        a.b_fk = b;
        b.a_fk = a;
        context.As.AddObject(a);
  } 

createAAndBMethod2(Entities context)
{
        A a = new A();
        B b = new B();
        a.b_fk = b;
        context.As.AddObject(a);
        context.SaveChanges();
        b.a_fk = a;
        context.SaveChanges();    
}

我觉得你的模特有问题;表具有对B表的外键引用;表B有一个表的外键引用。那么为什么不合并这些表,只创建一个表呢

如果你试图建立一对一的关系,这不是正确的方法

更新:
数据库设计不恰当。仅在表B中创建外键就足够了。不需要在表a中创建外键,因为这样的设计满足“a可能有0个或多个B”。

类似于您希望使用一个上下文,同时又有一个两个表

    var p = new Person()
    {
        LastName = "test1111111111",
    };
    var c = new Child()
    {
        Name = "Testchild"
    };
    PersonTest(p, c);


不,可能有许多
B
指向一个
A
,例如:
A
A
B
b1
b2
b3
a.b_fk=b1
{allbs}.a_fk=a
。例如,
A
是一个人,
B
是一条领带,
B_-fk
是一条领带,
A_-fk
是主人。@Ari那么你的例子不合适;您应该使用a.Bs.Add(b1)等。它仍然不起作用,即使我不会以任何方式设置
B.a\u fk
字段(直接通过
a\u fk
字段或通过
a
中的
Bs
)。我觉得a和B表之间的关系类型很重要。那么您的db设计不合适。两个表相互引用的目的是什么?为什么“A可能有0个或多个Bs”对您来说还不够?我不确定,但对于您的依赖性,您可能需要删除第二行:context.Bs.AddObject(b);两者都不起作用(试过了)。即使我删除了这两行的一部分,它也不起作用。我想这会有帮助:我希望你的类a和b有相似的结构:公共类a{public virtual b{get;set;}…}下次,你必须包括框架实体的版本:)
    var p = new Person()
    {
        LastName = "test1111111111",
    };
    var c = new Child()
    {
        Name = "Testchild"
    };
    PersonTest(p, c);
    public void PersonTest(Person ob, Child ob2)
    {
        try
        {
            using (var con = new Entities())
            {
                con.Configuration.AutoDetectChangesEnabled = false;
                var o = new Person();
                if (ob.PersonId > 0)
                    o = con.People.Find(ob.PersonId);

                o.PersonId = ob.PersonId;
                o.LastName = ob.LastName;
                if (ob.PersonId == 0)
                    con.People.Add(o);
                con.ChangeTracker.DetectChanges();
                con.SaveChanges();
                i = o.PersonId;

                var o2 = new Child();
                if (ob2.ChildrenId > 0)
                    o2 = con.Children.Find(ob.PersonId);

                o2.PersonId = ob2.ChildrenId;
                o2.Name = ob2.Name;
                o2.PersonId = i;
                if (ob2.ChildrenId == 0)
                    con.Children.Add(o2);
                con.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.InnerException.Message);
        }
        finally
        {
            con.Configuration.AutoDetectChangesEnabled = true;
        }
    }