সত্তা ফ্রেমওয়ার্ক এবং এসকিউএল সার্ভার দেখুন


132

আমার যে বিষয়ে কথা বলার স্বাধীনতা নেই তা বেশ কয়েকটি কারণে আমরা আমাদের এসকিএল সার্ভার ২০০৫ ডাটাবেসে এমন একটি মতামত সংজ্ঞায়িত করছি:

CREATE VIEW [dbo].[MeterProvingStatisticsPoint]
AS
SELECT
    CAST(0 AS BIGINT) AS 'RowNumber',
    CAST(0 AS BIGINT) AS 'ProverTicketId',
    CAST(0 AS INT) AS 'ReportNumber',
    GETDATE() AS 'CompletedDateTime',
    CAST(1.1 AS float) AS 'MeterFactor',
    CAST(1.1 AS float) AS 'Density',
    CAST(1.1 AS float) AS 'FlowRate',
    CAST(1.1 AS float) AS 'Average',
    CAST(1.1 AS float) AS 'StandardDeviation',
    CAST(1.1 AS float) AS 'MeanPlus2XStandardDeviation',
    CAST(1.1 AS float) AS 'MeanMinus2XStandardDeviation'
WHERE 0 = 1

ধারণাটি হ'ল সত্তা ফ্রেমওয়ার্ক এই ক্যোয়ারির উপর ভিত্তি করে একটি সত্তা তৈরি করবে, যা এটি করে তবে এটি এটি একটি ত্রুটি সহ জেনারেট করে যা নীচে বর্ণিত:

সতর্কতা 6002: সারণী / দর্শন 'কীস্টোন_লোকাল.ডবো.মিটারপ্রোভিংস্ট্যাটিস্টিকস পয়েন্ট' এর কোনও প্রাথমিক কী সংজ্ঞায়িত করা হয়নি। কীটি অনুমান করা হয়েছে এবং সংজ্ঞাটি কেবল পঠনযোগ্য টেবিল / দর্শন হিসাবে তৈরি করা হয়েছিল।

এবং এটি স্থির করে যে কমপ্লিটডেটটাইম ক্ষেত্রটি এই সত্তার প্রাথমিক কী হবে।

আমরা মডেলটি তৈরি করতে এডমেন ব্যবহার করছি। সত্তার কাঠামোতে এই ভিউয়ের কোনও ক্ষেত্রকে প্রাথমিক কী হিসাবে অন্তর্ভুক্ত না করার কোনও উপায় আছে কি?

উত্তর:


245

আমাদের একই সমস্যা ছিল এবং এটিই সমাধান:

প্রাথমিক কী হিসাবে কোনও কলামটি সত্ত্বার কাঠামোকে বাধ্য করতে, ইসনুল ব্যবহার করুন।

প্রাথমিক কী হিসাবে কোনও কলামটি কলাম ব্যবহার না করার জন্য সত্তা কাঠামোকে বাধ্য করতে, নুলিফ ব্যবহার করুন।

এটি প্রয়োগ করার একটি সহজ উপায় হ'ল আপনার ভিউয়ের নির্বাচিত বিবৃতিটি অন্য একটি নির্বাচনের মধ্যে মোড়ানো।

উদাহরণ:

SELECT
  ISNULL(MyPrimaryID,-999) MyPrimaryID,
  NULLIF(AnotherProperty,'') AnotherProperty
  FROM ( ... ) AS temp

2
আমি আশা করি এটি সবচেয়ে ভাল। নীচে লাইন এটি কাজ করে।
এমভিসিসিএমএস জুন

1
ধন্যবাদ! এটি পুরোপুরি কাজ করেছে। @ সাবানিতো আমার ধারণা এটি সংজ্ঞাটিকে বিশ্লেষণ করে। এজন্য আপনাকে বিশেষত ইসনুল () -তে মূল বৈশিষ্ট্যগুলি মোড়ানো দরকার। আমার একটি দৃষ্টিভঙ্গি রয়েছে যা কোনও নাল ফেরায় না (এবং কোনও নাল ফেরত দিতে পারে না) তবে যুক্তিটি যেভাবে লেখা হয়েছিল, EF নির্ধারণ করতে পারেনি যে আমি ইসনুল () -তে চাবিগুলি মোড়ানো না হওয়া পর্যন্ত এটি ছিল was
রাব্বি

3
আমি এখানে কেবল দেখতে পাচ্ছি সমস্যাটি বৈধভাবে একটি খালি স্ট্রিং '"ফিরিয়ে আনার প্রয়োজন হতে পারে। আমি যা করেছি, তা কেবল কলামটি তার নিজস্ব ডেটা টাইপের পিছনে ফেলে দেওয়া হয়েছিল। উদাহরণস্বরূপ, যদি অ্যানড্রোপার্টিটির ভারচারের একটি ডেটাটাইপ থাকে (50) আমি এটিকে 'কনভার্ট (ভারচার (50), আঞ্চলিকোপার্টি) হিসাবে [অন্য একটি প্রপার্টি] হিসাবে কাস্ট করব। এটি EF থেকে অযোগ্যতাটি মুখোশ করেছে এবং খালি স্ট্রিংকেও অনুমতি দিয়েছে।
বার্ট

2
হ্যাঁ, উদাহরণস্বরূপ EF কলামটি প্রাথমিক কী ইসনুল হিসাবে ব্যবহার করুন (কনভার্ট (ভ্যাচারার (50), নতুন আইডি ()), '') এএস [পিকে]
ডিসি ২০০৯

2
সমাধানটি বাদ দিয়ে কেবল বিরক্তিকর বার্তা হ'ল এটিকে ঠিক না করার কোনও ক্ষতি আছে কি? আমি আপনার সমাধানের সাথে একমত, তবে প্রকৃতপক্ষে আমি মনে করি না যে আমাকে এই কাজটি করা উচিত - আমি মনে করি আমরা সবাই একমত হতে পারি এটি একটি বাগ সঠিক?
ডিসলেক্সিকানাবোকো

67

আমি ডিজাইনার ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছি।

  1. মডেল ব্রাউজারটি খুলুন।
  2. চিত্রটিতে দৃশ্যটি সন্ধান করুন।
  3. প্রাথমিক কীতে ডান ক্লিক করুন এবং "সত্তা কী" চেক করা আছে তা নিশ্চিত করুন।
  4. সমস্ত অ-প্রাথমিক কীগুলি একাধিক নির্বাচন করুন। Ctrl বা Shift কী ব্যবহার করুন।
  5. প্রোপার্টি উইন্ডোতে (এটি দেখতে প্রয়োজনে F4 টিপুন), "সত্তা কী" ড্রপ-ডাউনকে মিথ্যাতে পরিবর্তন করুন।
  6. পরিবর্তনগুলোর সংরক্ষন.
  7. ভিজ্যুয়াল স্টুডিও বন্ধ করুন এবং এটি আবার খুলুন। আমি EF 6 এর সাথে ভিজ্যুয়াল স্টুডিও 2013 ব্যবহার করছি এবং সতর্কতাগুলি সরে যাওয়ার জন্য আমাকে এটি করতে হয়েছিল।

ISNULL, NULLIF, বা COALESCE workaround ব্যবহার করতে আমার দৃষ্টিভঙ্গি পরিবর্তন করতে হবে না। আপনি যদি ডেটাবেস থেকে আপনার মডেলটি আপডেট করেন তবে সতর্কতাগুলি আবার উপস্থিত হবে, তবে আপনি ভিএস বন্ধ করে আবার খুললে তা চলে যাবে। ডিজাইনারে আপনি যে পরিবর্তনগুলি করেছেন তা সংরক্ষণ করা হবে এবং রিফ্রেশ দ্বারা প্রভাবিত হবে না।


9
নিশ্চিত করেছে। সতর্কতাটি দূরে সরাতে VS2013 পুনরায় চালু করতে হবে।
মাইকেল লোগুতভ

5
"আপনার কি এটি বন্ধ করে আবার চালু করার চেষ্টা আছে?" ;-) ধন্যবাদ, একটি কবজ মত কাজ!
ওব্ল টবল

4
আমি যখন ভিউ তৈরি করি তখন এগুলি মডেল ডায়াগ্রামেও পাওয়া যায় না। তারা
xML

সহজ এবং সহজ সমাধান এবং ভিউ হেরফের হিসাবে যতটা কোনও ননো হ্যাকি ঠিক ততটা মনে হয় না! ধন্যবাদ.
Luqenen

2
সতর্কবার্তাটি সরে যাওয়ার জন্য নিশ্চিত ভিএস2017 পুনরায় চালু করা দরকার।
মার্ক লেভেস্ক

46

@ টিলিটোর সাথে সম্মত হোন, তবে বেশিরভাগ ক্ষেত্রে এটি এসকিউএল অপ্টিমাইজারকে মূর্খ করবে এবং এটি সঠিক সূচকগুলি ব্যবহার করবে না।

কারও পক্ষে এটি সুস্পষ্ট হতে পারে, তবে আমি টিলিটো সমাধান ব্যবহার করে পারফরম্যান্সের সমস্যাগুলি সমাধানের জন্য কয়েক ঘন্টা পোড়া করেছি। আপনাকে টেবিল আছে বলে দেয়:

 Create table OrderDetail
    (  
       Id int primary key,
       CustomerId int references Customer(Id),
       Amount decimal default(0)
    );
 Create index ix_customer on OrderDetail(CustomerId);

এবং আপনার দৃষ্টিভঙ্গি এইরকম কিছু

 Create view CustomerView
    As
      Select 
          IsNull(CustomerId, -1) as CustomerId, -- forcing EF to use it as key
          Sum(Amount) as Amount
      From OrderDetail
      Group by CustomerId

SQL অপ্টিমাইজার সূচক ix_customer ব্যবহার করবে না এবং এটি প্রাথমিক সূচীতে টেবিল স্ক্যান করবে, তবে পরিবর্তে যদি:

Group by CustomerId

তুমি ব্যাবহার কর

Group by IsNull(CustomerId, -1)

এটি এমএস এসকিউএলকে তৈরি করবে (কমপক্ষে ২০০৮) পরিকল্পনায় সঠিক সূচক অন্তর্ভুক্ত করবে।

যদি


2
এটি টিলিটোর জবাব সম্পর্কে একটি মন্তব্য হওয়া উচিত, নিজেই কোনও উত্তর নয়, কারণ এটি ওপি-র প্রশ্নের সমাধান দেয় না।
জিমদানেন

6
লোকটির 1 জন প্রতিনিধি রয়েছে, তিনি কোনও মন্তব্য যোগ করতে পারেন না, এখনও।
jrcs3

@ জিমদানেন কোনও মন্তব্য নেই যাতে আপনি এই সমস্ত তথ্য একটি মন্তব্যে ফিট করতে পারেন, এটি পৃথক উত্তরে রেখে দেওয়া আরও বোধগম্য।
কনটাঙ্গো

2
@ কনটাঙ্গো: এই উত্তরটি পোস্ট হওয়ার ছয় দিন পরে সম্পাদিত হয়েছিল এবং আমি আমার মন্তব্য পোস্ট করেছি। সংশোধন ইতিহাস দেখুন।
জিমদানেন

9

এই পদ্ধতিটি আমার পক্ষে ভাল কাজ করে। আমি প্রাথমিক কী ক্ষেত্রের জন্য ISNULL () ব্যবহার করি, এবং ক্ষেত্রটি প্রাথমিক কী না হওয়া উচিত তবে COALESCE () ব্যবহার করা উচিত, তবে এতে একটি অ-অযোগ্য মানও হওয়া উচিত। এই উদাহরণটি একটি নন-অযোগ্য প্রাথমিক কী সহ আইডি ফিল্ড দেয়। অন্যান্য ক্ষেত্রগুলি কীগুলি নয় এবং তাদের নুলযোগ্য বৈশিষ্ট্য হিসাবে (কোনওটি নয়) রয়েছে।

SELECT      
ISNULL(P.ID, - 1) AS ID,  
COALESCE (P.PurchaseAgent, U.[User Nickname]) AS PurchaseAgent,  
COALESCE (P.PurchaseAuthority, 0) AS PurchaseAuthority,  
COALESCE (P.AgencyCode, '') AS AgencyCode,  
COALESCE (P.UserID, U.ID) AS UserID,  
COALESCE (P.AssignPOs, 'false') AS AssignPOs,  
COALESCE (P.AuthString, '') AS AuthString,  
COALESCE (P.AssignVendors, 'false') AS AssignVendors 
FROM Users AS U  
INNER JOIN Users AS AU ON U.Login = AU.UserName  
LEFT OUTER JOIN PurchaseAgents AS P ON U.ID = P.UserID

যদি আপনার সত্যিই প্রাথমিক কী না থাকে তবে আপনি আপনার কোড দ্বারা উপেক্ষা করা একটি সিডো-কী তৈরি করতে ROW_NUMBER ব্যবহার করে একটি ছদ্মবেশী করতে পারেন। উদাহরণ স্বরূপ:

SELECT
ROW_NUMBER() OVER(ORDER BY A,B) AS Id,
A, B
FROM SOMETABLE

হ্যাঁ, আমি প্রতারণা শেষ করেছি NEWID() as id, তবে এটি একই ধারণা। এবং বৈধ ব্যবহারের ক্ষেত্রে রয়েছে - উদাহরণস্বরূপ, যদি আপনি কেবল পঠনযোগ্য ভিউ পান। কুৎসিত, ইএফ, কুরুচিপূর্ণ।
রাফিন

4

বর্তমান সত্তা ফ্রেমওয়ার্ক ইডিএম জেনারেটর আপনার দৃষ্টিতে সমস্ত অ-অযোগ্য ক্ষেত্র থেকে একটি সম্মিলিত কী তৈরি করবে। এটির উপর নিয়ন্ত্রণ অর্জনের জন্য, যখন আপনি চান না যে আপনি প্রাথমিক কী এর অংশ হতে চান তখন আপনাকে কলামগুলি স্থির করে দেওয়ার জন্য ভিউ এবং অন্তর্নিহিত সারণী কলামগুলি সংশোধন করতে হবে। বিপরীতটিও সত্য, যেমনটি আমি মুখোমুখি হয়েছিলাম, EDM উত্পন্ন কীটি ডেটা-নকলের সমস্যা সৃষ্টি করছিল, তাই আমি এই কলামটি অন্তর্ভুক্ত করতে EDM- তে সম্মিলিত কীটি বাধ্য করার জন্য একটি নল কলামকে নন-নল হিসাবে সংজ্ঞায়িত করতে হয়েছিল।


অনুমিত পিকে নিয়ে আমাদের একই সমস্যা রয়েছে, সত্তা নকল রেকর্ডগুলি ফিরিয়ে দেয় এবং সম্পূর্ণ বিরক্তিকর। আপনি যদি Context.Entity.ToList()সদৃশ রেকর্ডগুলি কার্যকর করেন তবে আপনি যদি ইএফ দ্বারা উত্পাদিত এসকিউএল ক্যোয়ারী সরাসরি চালিত করেন (লাইনকিপ্যাড দিয়ে প্রাপ্ত), কোনও রেকর্ড সদৃশ ঘটে না। সত্ত্বা অবজেক্টগুলিতে (পোকো) ডাটাবেস রেকর্ডগুলি ম্যাপিংয়ে সমস্যা বলে মনে হয়েছে, কারণ পিকে ব্যাখ্যা করা যুক্তি (নন কলাম কলাম) ব্যবহার করে অনুমান করা হয়েছে।
ডেভিড অলিভান উবিয়তো

3

দেখে মনে হচ্ছে এটি এডমেনের সাথে পরিচিত সমস্যা: http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/12aaac4d-2be8-44f3-9448-d7c659585945/


এটা বোধগম্য. সুতরাং, কোনও স্তম্ভকে শূন্য বা নাল হিসাবে সংজ্ঞায়িত করার উপায় নেই যেখানে আমরা এটি সংজ্ঞায়িত করছি?
সেরজিও রোমেরো

1
দুঃখিত, আমি ইতিমধ্যে সত্ত্বা ফ্রেমওয়ার্কে আমার দক্ষতার স্তরের বাইরে। :-)
আরবেরি ইয়ং

1
এই সমস্যাটি কখন ঠিক করা হবে তা কেউ জানেন? আপনার যখন প্রাথমিক কী নয় এমন নাল কলাম রয়েছে তখন এটিকে পুনরায় কাজ করতে হবে বলে বিরক্তিকর।
লাইভ-

3

একটি ভিউ পেতে আমাকে কেবল একটি প্রাথমিক কী কলামটি দেখাতে হয়েছিল আমি একটি দ্বিতীয় ভিউ তৈরি করেছি যা প্রথমগুলিকে নির্দেশ করে এবং প্রকারগুলিকে নলাবদ্ধ করতে NULLIF ব্যবহার করে used এটি আমার জন্য EF কে ভাবতে চেষ্টা করেছিল যে ভিউটিতে একটিমাত্র প্রাথমিক কী আছে।

এটি আপনাকে সাহায্য করবে কিনা তা নিশ্চিত নই যদিও আমি বিশ্বাস করি না যে EF কোনও প্রাথমিক কী সহ কোনও সত্তা গ্রহণ করবে।


3

প্রাথমিক কী কী হওয়া উচিত তা নিয়ে যদি আপনি গণ্ডগোল করতে না চান তবে আমি সুপারিশ করছি:

  1. নিগমবদ্ধ ROW_NUMBERআপনার নির্বাচনের মধ্যে
  2. এটি প্রাথমিক কী হিসাবে সেট করুন
  3. মডেলটিতে অন্যান্য সমস্ত কলাম / সদস্যকে অ-প্রাথমিক হিসাবে সেট করুন

1

উল্লিখিত সমস্যার কারণে আমি টেবিলের মানগুলি পছন্দ করি।

আপনার যদি এটি থাকে:

CREATE VIEW [dbo].[MyView] AS SELECT A, B FROM dbo.Something

এটি তৈরি করুন:

CREATE FUNCTION MyFunction() RETURNS TABLE AS RETURN (SELECT * FROM [dbo].[MyView])

তারপরে আপনি কেবল ভিউয়ের পরিবর্তে ফাংশনটি আমদানি করুন।


2
এই পদ্ধতির সাথে সংস্থাগুলির মধ্যে কীভাবে সমিতি তৈরি করবেন? এটা কি সম্ভব?
ggderas
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.