मेरा एक छोटा सा सवाल है।

परियोजना का संक्षिप्त विवरण: मैं सी # में लिखी गई एक छोटी एपीआई परियोजना पर काम कर रहा हूं। इस परियोजना के अंदर मैं प्याज वास्तुकला का उपयोग कर रहा हूं, संक्षेप में यह नियंत्रक -> सेवा -> रिपोजिटरी जैसा कुछ है।

मेरे पास एक खाता नियंत्रक है, जो उपयोगकर्ता को बनाने और अद्यतन करने का प्रबंधन करता है और इसके अलावा मेरे पास निम्नलिखित तालिकाओं के साथ एक डेटाबेस है:

User, Password, UserInformation

User में मेरे पास निम्नलिखित कॉलम हैं: आईडी (पीके), उपयोगकर्ता नाम और भूमिका।

Password में मेरे पास है: User_Id(PK और FK to User - Id column), पासवर्ड और पुराना पासवर्ड (यदि आवश्यक हो)।

UserInformation में मेरे पास है: User_Id(PK और FK to User - Id column), firstName, lastName और ईमेल।

डेटा डालने के लिए, मेरे पास स्ट्रिंग स्थिरांक के साथ एक अलग वर्ग है जिसके अंदर प्रश्न हैं और मैं उन्हें निष्पादित कर रहा हूं

sqlConnection.QueryAsync(QueryFromStringConstants, etcParams).

जैसा कि मैं एसक्यूएल सिंटैक्स और सामान्य रूप से एसक्यूएल से संबंधित सब कुछ (हाहा) के साथ थोड़ा सा नोबिश हूं, मेरा सवाल है: यदि मैं एक User बनाता हूं, तो मैं एक ही समय में सभी 3 तालिकाओं में डेटा कैसे सम्मिलित कर सकता हूं। ?

धन्यवाद :)

0
C.Rus 7 फरवरी 2021, 13:23

3 जवाब

सबसे बढ़िया उत्तर

यदि आपकी User टेबल पर आपकी प्राथमिक कुंजी एक int या bigint है, तो आप PK प्राप्त करने के लिए SCOPE_IDENTITY फ़ंक्शन का उपयोग करते हैं।

set nocount, xact_abort on;   --recommended

begin transaction;

insert into user(User_Id,userName,...)
values(...);

declare @user_id int = scope_identity();   -- make sure this is the very next line after insert

insert into Password(User_Id,....)
values(@user_id,...);

insert into UserInformation(User_Id,....)
values(@user_id,...);

commit transaction;

यदि आप एक बहु-पंक्ति सम्मिलित कर रहे हैं, तो आप तालिका-मूल्यवान पैरामीटर्स का उपयोग कर सकते हैं। और फिर आपको एक नए तालिका चर में आईडी आउटपुट करने के लिए OUTPUT क्लॉज की आवश्यकता होगी:

set nocount, xact_abort on;   --recommended

begin transaction;

declare @new_users table (user_id int, username varchar(50));

insert into user(User_Id,userName,...)
output inserted.user_id, inserted.username
select ...
from @users;

insert into Password(User_Id,....)
select u.user_id, ...
from passwords p
join @new_users u on u.username = p.username;

commit transaction;

हालांकि, मुझे कहना होगा कि मुझे UserInformation के लिए एक अलग तालिका रखने का कोई मतलब नहीं दिखता, आखिरकार, आपके पास User UserInformation के बिना नहीं हो सकता है, इसलिए आपको इन्हें जोड़ना चाहिए एक।

0
Charlieface 7 फरवरी 2021, 14:19

प्रत्येक इंसर्ट के लिए एक अलग इंसर्ट स्टेटमेंट की आवश्यकता होती है, और आपको प्रत्येक इंसर्ट के बाद अगले इंसर्ट के लिए इसका उपयोग करने के लिए एक पहचान मूल्य भी प्राप्त करना चाहिए, उदाहरण के लिए:

  1. प्रयोक्ता सम्मिलित करें: INSERT INTO User (userName, role) VALUES (...)
  2. उपयोगकर्ता आईडी प्राप्त करें (मुझे यकीन है कि आपने इसे पहचान के रूप में परिभाषित किया है): DECLARE @userId AS integer = (SELECT @@IDENTITY);
  3. यूजर पासवर्ड डालें (प्रीवोयस स्टेप पर प्राप्त यूजर आईडी के साथ)
  4. उपयोगकर्ता जानकारी डालें (वही)

लेकिन आप इकाई ढांचे का भी उपयोग कर सकते हैं। आपको कक्षा User बनानी चाहिए, जिसमें Password और UserInformation प्रकार के आभासी गुण हों (ऐसी कक्षाएं भी जो आपको बनानी चाहिए)। फिर एक संदर्भ बनाएं जिसमें एक संपत्ति हो DbSet<User> Users। इस मामले में आप केवल उपयोगकर्ता उदाहरण बनाते हैं, इसके फ़ील्ड, पासवर्ड और उपयोगकर्ता सूचना को पासवर्ड और उपयोगकर्ता सूचना वर्गों के संवाददाता उदाहरणों के साथ पॉप्युलेट करते हैं। फिर उपयोग करें:

context.Users.Add(userInstanceVar);
context.SaveChanges();

बस इतना ही! EF आपके डेटाबेस में सभी इंस्टेंस को सेव करेगा, और सभी पहचान मानों को स्वचालित रूप से पॉप्युलेट भी करेगा।

0
Evgeny Gorb 7 फरवरी 2021, 14:09

आपको प्राथमिक तालिका में फिर दूसरों में सम्मिलित करना होगा। और तीन कथनों को चलाने के लिए लेनदेन का उपयोग करें। ओरेकल प्रक्रिया का उपयोग कर एक उदाहरण निम्नलिखित है:

create or replace PROCEDURE InsertUser(.. params ...) 
as 
temp_id number;
BEGIN
insert into user(User_Id,userName,...) values(...) returning User_Id into temp_id;
insert into Password(User_Id,....) values(temp_id,...);
insert into UserInformation(User_Id,....) values(temp_id,...);
commit;
exception when others then rollback;
END InsertUser;
-1
Anas Sharabati 7 फरवरी 2021, 14:02