EF কোড প্রথম: নুগেট প্যাকেজ কনসোল থেকে আমি কীভাবে 'এন্টিভিডিলেশনআরিয়ার্স' দেখব?


127

আমি এর ক্ষতি করছি:

আমি কোনও সত্তা কাঠামোর (4.1.3) কোড প্রথম পদ্ধতির জন্য আমার ক্লাসগুলি সংজ্ঞায়িত করেছি। আমি বীজ শুরু না করা পর্যন্ত সবকিছু ঠিক ছিল (আমি টেবিলগুলি তৈরি করছিলাম)।

এখন আমি যখন

Add-Migration "remigrate" ; Update-Database;

আমি প্যাকেজ কনসোলটিতে একটি ত্রুটি পেয়েছি "এক বা একাধিক সত্তার জন্য বৈধতা ব্যর্থ হয়েছে more

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

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


দ্রুত আপডেট: আমি আমার পদ্ধতির মধ্যে প্রতিটি ভেরিয়েবলকে নিয়মিতভাবে ট্র্যাক করে আমার সমস্যাটি সমাধান করেছি যতক্ষণ না আমি খুঁজে পেয়েছি যে ত্রুটির কারণ ঘটছে। তবে, আমি এখনও আমার প্রশ্নের উত্তর জানতে চাই কারণ এটি আরও দ্রুত হবে!
জেরেমি

আমি মনে করি আপনি প্রোগ্রামটি মাইগ্রেশন চালাতে পারবেন এবং তারপরে ব্যতিক্রমটি ধরতে এবং ত্রুটিগুলি সম্পর্কে পুনরাবৃত্তি করতে পারেন। এটি আদর্শ নয় তবে আপনাকে আপনার প্রয়োজনীয় বিশদটি দিতে পারে।
পাভেল

হতাশাজনক উত্তর যখন উত্তরগুলির শীর্ষে থাকে এবং সমস্ত কৃতিত্ব পায়। এমন একটি জায়গা যেখানে স্ট্যাকওভারফ্লো স্পষ্টভাবে ছোট হয়ে যায়!
jwize

আপনি যদি সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করেন তবে সমাধানের জন্য আমার উত্তরটির দিকে একবার নজর রাখতে পারেন "এক বা একাধিক প্রতিষ্ঠানের জন্য বৈধতা ব্যর্থ হয়েছে। আরও তথ্যের জন্য 'সত্তাবিশেষকরণের ত্রুটি' সম্পত্তি দেখুন । আশা করি এটি সহায়তা করে ...
মুরাত ইল্ডেজ

উত্তর:


216

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

কোড অনুসরণ:

/// <summary>
/// Wrapper for SaveChanges adding the Validation Messages to the generated exception
/// </summary>
/// <param name="context">The context.</param>
private void SaveChanges(DbContext context) {
    try {
        context.SaveChanges();
    } catch (DbEntityValidationException ex) {
        StringBuilder sb = new StringBuilder();

        foreach (var failure in ex.EntityValidationErrors) {
            sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
            foreach (var error in failure.ValidationErrors) {
                sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                sb.AppendLine();
            }
        }

        throw new DbEntityValidationException(
            "Entity Validation Failed - errors follow:\n" + 
            sb.ToString(), ex
        ); // Add the original exception as the innerException
    }
}

শুধু কল প্রতিস্থাপন context.SaveChanges()সঙ্গে SaveChanges(context)আপনার বীজ পদ্ধতিতে।


রিচার্ড, অবশেষে! একটি ধারণা সঙ্গে কেউ। একবার চেষ্টা করার পরে আমি এই প্রশ্নে ফিরে আসব।
জেরেমি

এটি সত্যই নবীর দশকে সন্ধান করতে সহায়তা করে :)
এমিনেম

3
আমি এই কৌশলটি ব্যবহার করেছি তবে পরিবর্তে প্রসঙ্গের অভ্যন্তরে সেভচেন্জগুলির ওভাররাইড ব্যবহার করেছি। public override int SaveChanges() প্রসঙ্গে ভিতরে।
কার্স্টেন লোভ

5
আমি নীচে উত্তর হিসাবে আংশিক ক্লাস ব্যবহার করে এটি আরও কার্যকর।
jwize

1
আপনি যদি নিজের বীজ পদ্ধতিতে ইউজার ম্যানেজার অপারেশন করছেন তবে এই পরিবর্তনটি আউটপুটে বৈধতা ত্রুটি অন্তর্ভুক্ত করবে না, আপনি @ জাইজাইজের উত্তর অনুসারে ডিবিসিএনটেক্সট সেভচেনজেস, সেভচেনজেন্সিয়েন্স এবং সেভচেনজেসেনসিঙ্ক (সিটি) পদ্ধতিগুলিকে ওভাররাইড করতে হবে।
কার্ল

115

আংশিক শ্রেণীর সংজ্ঞা নিয়ে ইতিমধ্যে আপনার ডিবিসিঅন্টেক্সট ক্লাসটি প্রসারিত করুন!

আপনি যদি আপনার DbContext এর জন্য শ্রেণির সংজ্ঞাটি দেখেন তবে এটি নীচের মতো কিছু হবে:

// DatabaseContext.cs   -- This file is auto generated and thus shouldn't be changed. 
public partial class [DatabaseContextName] : DbContext { ... }

সুতরাং, অন্য কোনও ফাইলে আপনি একই সংজ্ঞা তৈরি করতে এবং আপনি যে অংশগুলি চান তা ওভাররাইড করতে পারেন।

// partialDatabaseContext.cs  -- you can safely make changes 
// that will not be overwritten in here.
public partial class [DatabaseContextName] : DbContext { // Override defaults here } 

আংশিক ক্লাস সহ পুরো ধারণা - আপনি কি লক্ষ্য করেছেন যে DbContext একটি আংশিক শ্রেণি - এটি হল যে আপনি তৈরি করা ক্লাসটি প্রসারিত করতে পারেন (বা একাধিক ফাইলে ক্লাসগুলি সংগঠিত করতে পারেন) এবং আমাদের ক্ষেত্রে আমরা SaveChanges পদ্ধতিকে ওভাররাইড করতে চাই আংশিক শ্রেণীর মধ্যে থেকে যা ডিবি কনটেক্সটকে যুক্ত করে

এইভাবে আমরা সমস্ত বিদ্যমান DbContext / SaveChanges কলগুলি থেকে ত্রুটি ডিবাগিং তথ্য পেতে পারি এবং আপনার বীজ কোড বা বিকাশ কোডটি কোনও ক্ষেত্রেই পরিবর্তন করতে হবে না।

এটিই আমি করতাম ( পার্থক্যটি লক্ষ্য করুন যে আমি কেবল নিজের লেখক DbContext আংশিক শ্রেণিতে SaveChanges পদ্ধতি ওভাররাইড করি, জেনারেটেড নয় )। এছাড়াও, নিশ্চিত করুন যে আপনি আংশিক বর্গ সঠিক নাম স্থানটি ব্যবহার করেছেন বা আপনি প্রাচীরের বিপরীতে আপনার মাথাটি ঘায়েল করবেন।

public partial class Database : DbContext
{
    public override int SaveChanges()
    {
        try
        {
            return base.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            var sb = new StringBuilder();

            foreach (var failure in ex.EntityValidationErrors)
            {
                sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                foreach (var error in failure.ValidationErrors)
                {
                    sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                    sb.AppendLine();
                }
            }

            throw new DbEntityValidationException(
                "Entity Validation Failed - errors follow:\n" +
                sb.ToString(), ex
                ); // Add the original exception as the innerException
        }
    }
}

তুমি একজন প্রতিভাবান ...!
ফ্লোরিয়ান এফ 15

দুর্দান্ত সমাধান। লোকেদের আপত্তিকরণের আগে সমস্ত উত্তর পড়তে হবে।
গিলহার্ম ডি জেসুস সান্টোস

3
আপনার SaveChangesAsync এবং SaveChangesAsync (বাতিলকরণ টোকেন) কেও ওভাররাইড করা উচিত - কমপক্ষে প্রথমে কোডের ক্ষেত্রে এটিই, মডেল / ডিবি সম্পর্কে প্রথমে নিশ্চিত নয়।
কার্ল

@jwize। আপনার উত্তর আমাকে আমার ডাটাবেসে প্রথম মডেলিংয়ের ব্যতিক্রম হ্যান্ডলিংয়ের বিষয়ে সহায়তা করেছিল। দুর্দান্ত উত্তর
3355307

1
কোডফার্স ব্যবহার করার সময় অবশ্যই DbContext উত্পন্ন হয় না। যাইহোক, আপনি যখন ডিজাইনার ব্যবহার করেন তখন DbContext এবং সত্তা শ্রেণিগুলি উত্পন্ন হয় এবং আংশিক বর্গ ব্যবহার করে ওভাররাইড করা আবশ্যক।
jwize

35

আমি রিচার্ডস উত্তরকে একটি এক্সটেনশন পদ্ধতির রূপান্তরিত করেছি:

  public static int SaveChangesWithErrors(this DbContext context)
    {
        try
        {
            return context.SaveChanges();
        }
        catch (DbEntityValidationException ex)
        {
            StringBuilder sb = new StringBuilder();

            foreach (var failure in ex.EntityValidationErrors)
            {
                sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                foreach (var error in failure.ValidationErrors)
                {
                    sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                    sb.AppendLine();
                }
            }

            throw new DbEntityValidationException(
                "Entity Validation Failed - errors follow:\n" +
                sb.ToString(), ex
            ); // Add the original exception as the innerException
        }
    }

এভাবে কল করুন:

context.SaveChangesWithErrors();

4

আমি ক্রেগভিএল এর সংস্করণ সি # তে রূপান্তরিত করেছি আমাকে প্রসঙ্গ যুক্ত করতে হয়েছিল ave সেভচেনজেসস (); এটি নীচের মত আমার জন্য কাজ করার জন্য।

try
{
    byte[] bytes = System.IO.File.ReadAllBytes(@"C:\Users\sheph_000\Desktop\Rawr.png");
    Console.WriteLine(bytes);

    context.BeverageTypes.AddOrUpdate(
        x => x.Name,
        new AATPos.DAL.Entities.BeverageType { ID = 1, Name = "Sodas" }
        );

    context.Beverages.AddOrUpdate(
        x => x.Name,
        new AATPos.DAL.Entities.Beverage { ID = 1, Name = "Coke", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 2, Name = "Fanta", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 3, Name = "Sprite", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 4, Name = "Cream Soda", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" },
        new AATPos.DAL.Entities.Beverage { ID = 5, Name = "Pepsi", BeverageTypeID = 1, ImageData = bytes, IsStocked = true, StockLevel = 10, Price = 10.00M, ImageMimeType = "test" }
        );

    context.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException ex)
{
    var sb = new System.Text.StringBuilder();
    foreach (var failure in ex.EntityValidationErrors)
            {
                sb.AppendFormat("{0} failed validation", failure.Entry.Entity.GetType());
        foreach (var error in failure.ValidationErrors)
                {
            sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
            sb.AppendLine();
                }
            }

    throw new Exception(sb.ToString());
}

3

আমাকে নীচের দিকে সঠিক পথে আনার জন্য রিচার্ড ধন্যবাদ (একই সমস্যা ছিল) মাইগ্রেশন কনফিগারেশন বীজ পদ্ধতিতে আমার জন্য কাজ করা মোড়ক ছাড়া এটি একটি বিকল্প:

 Protected Overrides Sub Seed(context As NotificationContext)

        Try
            context.System.AddOrUpdate(
               Function(c) c.SystemName,
                New E_NotificationSystem() With {.SystemName = "System1"},
                New E_NotificationSystem() With {.SystemName = "System2"},
                New E_NotificationSystem() With {.SystemName = "System3"})

            context.SaveChanges()

        Catch ex As DbEntityValidationException

            Dim sb As New StringBuilder

            For Each failure In ex.EntityValidationErrors

                sb.AppendFormat("{0} failed validation" & vbLf, failure.Entry.Entity.[GetType]())

                For Each [error] In failure.ValidationErrors
                    sb.AppendFormat("- {0} : {1}", [error].PropertyName, [error].ErrorMessage)
                    sb.AppendLine()
                Next
            Next

            Throw New Exception(sb.ToString())

        End Try
End Sub

তখন প্যাকেজ ম্যানেজার কনসোলে ব্যতিক্রম দেখতে সক্ষম হয়েছিল to আশা করি এটি কাউকে সাহায্য করবে।


-1

I Also had same model validation problem but successfully catch by myself after lot of thinking;

I use reverse engineering method to catch the problem out of Over 80 + Model Classes;

1> Made copy of dbcontext, changing the name (I add "1" at end and make respective changes in class constructor and initialization etc.

Old:
 
>public class AppDb : IdentityDbContext<ApplicationUser>
>     
> {
> public AppDb(): base("DefaultConnection", throwIfV1Schema: false)
> {
> 
> }
>     
> public static AppDb Create()
>{
>return new AppDb();
>} 

**New:**

>public class AppDb1 : IdentityDbContext<ApplicationUser>
>{
>public AppDb1()
>: base("DefaultConnection", throwIfV1Schema: false)
>{
>}
> 
>public static AppDb1 Create()
> {
> return new AppDb1();
>  }`

...
2> Make changes to Codefirst Migration Configuration from Old DbContext to my new Context.

> internal sealed class Configuration :
> DbMigrationsConfiguration<DAL.AppDb1> { public Configuration() {
> AutomaticMigrationsEnabled = false; }    protected override void
> Seed(DAL.AppDb1 context) {`

3> Comment the Dbsets in new DbContext which was doubt.
4> Apply update migration if succeeded the probelm lye in Commented section.
5> if not then commented section is clear of bug clear.
6> repeat the (4) until found the right place of bug.
7> Happy Codding


1
আপনি যখন আপনার কোডটি ফর্ম্যাট করেন যে আপনার পাঠ্য কোনও কোড ব্লকের ভিতরে নেই nice
jmattheis

এটি সম্ভবত সবচেয়ে খারাপ ফর্ম্যাটেড স্ট্যাকওভারফ্লো উত্তর যা আমি দেখেছি
ক্রেজি_ক্র্যাঙ্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.