【问题标题】:insert value to foreign key向外键插入值
【发布时间】:2011-11-06 03:22:25
【问题描述】:

问题在于外键:

INSERT 语句与 FOREIGN KEY 约束“FK_uzytkownik_Logowanie”冲突。数据库发生冲突 “Restauracja”,表“dbo.Logowanie”,列“LoginID”。
该语句已终止。

我使用断点检查这一点,并在断点(运行应用程序)之后添加了Logowanie 表中的主键

baza.SubmitChanges();

logowanie 表中LoginID 的主键在SubmitChanges 期间自动添加。

如何将LoginID 的值从logowanie 表复制到uztkownik 表中的LoginID?我在这里添加了外键值,但是这里LoginID还没有值。

Logowanie newlog = new Logowanie()
{
   Login = model.LoginModel.Użytkownik,
   Haslo = model.LoginModel.Hasło,
   konto = model.LoginModel.Konto
};

uzytkownik user = new uzytkownik()
{
   imie = model.uzytkownikModle.imie,
   nazwisko = model.uzytkownikModle.nazwisko,
   pesel = model.uzytkownikModle.pesel,
   nip = model.uzytkownikModle.nip,
   telefon = model.uzytkownikModle.telefon,
   adres_zamieszkania = model.uzytkownikModle.adres_zamieszkania,
   email = model.uzytkownikModle.email,
   LoginID = newlog.LoginID //<<<----------------
};

baza.Logowanies.InsertOnSubmit(newlog);
baza.uzytkowniks.InsertOnSubmit(user);

baza.SubmitChanges();

【问题讨论】:

  • 可能与stackoverflow.com/questions/5560564/…相同的问题
  • 假设您在数据库中有 FK 关系 - 您的 Linq-to-SQL 模型在这两个实体之间是否也有“链接”?例如。 user 对象是否具有某种 Login(作为登录对象 - 不仅仅是 ID)属性?
  • 我的 Linq-to-SQL 有一个“链接”Logowanie.LoginID -&gt; uzytkownik.LoginID imageshack.us/photo/my-images/507/unledgb.jpg" width="100" height="100">

标签: c# asp.net database asp.net-mvc-3 foreign-keys


【解决方案1】:

uzytkownik 应该有一个名为 Logowanie 的属性,您可以将其设置为您创建但尚未提交的新实例:

user.Logowanie = newlog;

【讨论】:

    【解决方案2】:

    由于它是外键关系,您的Logowanie 类应该包含IQueryable&lt;uzytkownik&gt; 的属性,用于以一对多的方式正确关联对象。因此,不再需要手动分配外键,可以通过对象层次结构来完成:

    Logowanie newlog = new Logowanie()
    {
       Login = model.LoginModel.Użytkownik,
       Haslo = model.LoginModel.Hasło,
       konto = model.LoginModel.Konto
    };
    
    uzytkownik user = new uzytkownik()
    {
       imie = model.uzytkownikModle.imie,
       nazwisko = model.uzytkownikModle.nazwisko,
       pesel = model.uzytkownikModle.pesel,
       nip = model.uzytkownikModle.nip,
       telefon = model.uzytkownikModle.telefon,
       adres_zamieszkania = model.uzytkownikModle.adres_zamieszkania,
       email = model.uzytkownikModle.email,
       // Remove this line entirely   LoginID = newlog.LoginID //<<<----------------
    };
    
    // Add the child object (user) to your Logowanie object (newlog)
    newlog.uzytkowniks.Add(user)  // This may just be uzytkownik. Pluralization in LINQ is weird
    
    // It is not necessary to queue the user object for insertion
    // the newlog object will do that for you
    baza.Logowanies.InsertOnSubmit(newlog);
    // baza.uzytkowniks.InsertOnSubmit(user);
    
    // SubmitChanges at this point will insert all of the children
    // of newlog and assign the IDs properly
    baza.SubmitChanges();
    
    // at this point you should be able to get the newlog.LoginID
    // and the user.UserID (assuming this is what you called it)
    

    当我第一次遇到这个问题时,它对我来说似乎有点落后,但是一旦你将关系分解为它们的类表示,它就真的开始变得有意义了。它为您完成所有关系分配也很棒。

    【讨论】:

    • 以前回答的工作,但你的太有趣了。您写道:“Logowanie 类应包含 IQueryable 的属性”,这意味着将其添加到我的 Logowanie 模型类中?例如。 public class LoginModel : IQueryable { ...当我运行时出现错误:{“对象引用未设置为对象的实例。”}
    • @user1031034:不,如果这些类是使用 DataContext(.dbml 文件)创建的,那么当您将表添加到其中时,该属性应该已自动生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2016-05-20
    • 2020-05-21
    • 2012-09-17
    • 1970-01-01
    • 2020-02-28
    相关资源
    最近更新 更多